Sto cercando di trovare un modo per sfruttare la vulnerabilità del buffer overflow nel seguente codice sorgente in modo che la linea, printf ("x is 1") venga saltata:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void func(char *str) {
char buffer[24];
int *ret;
strcpy(buffer,str);
}
int main(int argc, char **argv) {
int x;
x = 0;
func(argv[1]);
x = 1;
printf("x is 1");
printf("x is 0");
getchar();
}
Per fare ciò, voglio modificare la funzione "func". So che avrò bisogno di usare la variabile ret per modificare l'indirizzo di ritorno appena oltre la linea che voglio saltare, ma non sono sicuro di come farlo realmente.
Usando gdb, sono riuscito a trovare le seguenti chiamate nella funzione principale:
Temporary breakpoint 1, 0x00000000004005ec in main ()
(gdb) x/20i $pc
=> 0x4005ec <main+4>: sub $0x20,%rsp
0x4005f0 <main+8>: mov %edi,-0x14(%rbp)
0x4005f3 <main+11>: mov %rsi,-0x20(%rbp)
0x4005f7 <main+15>: movl $0x0,-0x4(%rbp)
0x4005fe <main+22>: mov -0x20(%rbp),%rax
0x400602 <main+26>: add $0x8,%rax
0x400606 <main+30>: mov (%rax),%rax
0x400609 <main+33>: mov %rax,%rdi
0x40060c <main+36>: callq 0x4005ac <func>
0x400611 <main+41>: movl $0x1,-0x4(%rbp)
0x400618 <main+48>: mov $0x4006ec,%edi
0x40061d <main+53>: mov $0x0,%eax
0x400622 <main+58>: callq 0x400470 <printf@plt>
0x400627 <main+63>: mov $0x4006f3,%edi
0x40062c <main+68>: mov $0x0,%eax
0x400631 <main+73>: callq 0x400470 <printf@plt>
0x400636 <main+78>: callq 0x400490 <getchar@plt>
0x40063b <main+83>: leaveq
0x40063c <main+84>: retq
0x40063d: nop
Anche se, sono confuso da dove andare da qui. So che la funzione tornerà alla linea di 0x400611 e che ho bisogno di farlo saltare a 0x400631, ma non sono sicuro di come determinare quanti bit saltare. Ho cercato di seguire l'esempio 3 da insecure.org/stf/smashstack.html, ma mi sono perso quando ho capito quanti bit aggiustare la mia variabile. Qualche aiuto?