我写了一个返回libc的攻击。我的脚本检索system(),exit()和shell地址,如下所示(它是一个调用某些c程序的sh脚本):
为xh shell创建环境变量:
export egg=/bin/xh
检索xh shell的地址:printf("%p\n", getenv("egg"));
获取system()的地址:void (*system_addr)(int) = dlsym(RTLD_NEXT, "system");
获取exit()的地址:void (*exit_addr)(int) = dlsym(RTLD_NEXT, "exit");
然后我使用正确数量的填充符+ system()
+地址exit()
+地址/bin/xh
溢出缓冲区。
当我运行我的漏洞利用(./exploit.sh
)时,xh shell被正确删除。问题是当我创建一个简单的Makefile来运行我的脚本时,我遇到了分段错误。 Makefile看起来像这样:
all:
./exploit8.sh
我的猜测是环境变量的地址取决于调用程序的名称,如this answer中所述。这是真的,因为我测试了更改易受攻击程序的名称,我必须提供的地址取决于名称的(长度)。
我需要一种方法来找到egg
的正确地址,该地址独立于易受攻击程序的名称。有没有一种优雅的方法来执行此操作而不是强制执行直到xh shell被删除?
我还读到system()
和exit()
的地址随make
变化,但我不认为这是我的问题,因为我是动态的加载我的漏洞利用中的地址。
修改
我只是试图打印egg
的地址然后通过检查附近的所有256 * 256地址来强制强制,但没有地址到达现场。使用egg
时,make
的地址似乎完全不同。