【发布时间】:2017-10-31 23:28:08
【问题描述】:
我有一个 32 位精灵程序,我必须远程利用它(用于学术目的)。
最终目标是生成一个外壳。我有一个堆栈,可以填充我想要的任何数据,并且可以滥用其中一个 printf 格式字符串。唯一的问题是 system/execv/execvp 没有被导入。 .got.plt 段充满了不太有用的功能,我想用system 替换atoi,因为它们的签名非常相似,并且代码流表明这是要替换的正确函数。对于以下尝试,我使用了 IDA 远程调试,因此堆栈对齐错误和格式字符串不正确是不可能的。我想确保它是可行的,显然对我来说还不是。
一开始我尝试用系统的非随机地址替换atoi@.got.plt。得到了 SIGSEGV。
好吧,这可能是因为 ASLR,所以让我们尝试一下其他方法。我加载了 gdb 并查找了 system@0xb7deeda0 和 atoi@0xb7de1250。然后我计算了差异,即 0xDB50。所以下次我在 .got.plt 段中将 atoi 的地址更改为 system 时,实际上我只是将 diff 添加到该值以获取 system 的地址。再次获得 SIGSEGV。
我的逻辑:
0xb7deeda0 <__libc_system>
0xb7de1250 <atoi>
diff = 0xb7deeda0 - 0xb7de1250
system@.got.plt = atoi@.got.plt + diff
example: 0x08048726 + DB50 = 0x08056276
谁能告诉我我做错了什么以及如何在从.got.plt 泄漏函数地址的帮助下跳转到“有效的系统()”?
【问题讨论】:
-
一般来说,你正在做的应该是可行的。既然没有,你一定做错了什么。但是不可能告诉 什么 那可能是,因为你用毫无意义的术语表达了你的问题:什么是“系统的静态地址”? “在.plt段中将atoi改为system”是什么意思?
-
您认为问题与惰性绑定有关,不是吗?所以它应该适用于
export LD_BIND_NOW=1,不是吗?