【问题标题】:How to find the address of a not imported libc function when ASLR is on?开启 ASLR 时如何查找未导入的 libc 函数的地址?
【发布时间】:2017-10-31 23:28:08
【问题描述】:

我有一个 32 位精灵程序,我必须远程利用它(用于学术目的)。 最终目标是生成一个外壳。我有一个堆栈,可以填充我想要的任何数据,并且可以滥用其中一个 printf 格式字符串。唯一的问题是 system/execv/execvp 没有被导入。 .got.plt 段充满了不太有用的功能,我想用system 替换atoi,因为它们的签名非常相似,并且代码流表明这是要替换的正确函数。对于以下尝试,我使用了 IDA 远程调试,因此堆栈对齐错误和格式字符串不正确是不可能的。我想确保它是可行的,显然对我来说还不是。

一开始我尝试用系统的非随机地址替换atoi@.got.plt。得到了 SIGSEGV。

好吧,这可能是因为 ASLR,所以让我们尝试一下其他方法。我加载了 gdb 并查找了 system@0xb7deeda0atoi@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,不是吗?

标签: linux libc exploit aslr


【解决方案1】:

回答我自己的问题。 测量你的函数之间的距离 l̲o̲c̲a̲l̲ libc 不保证 r̲e̲m̲o̲t̲e̲ libc 具有相同的对齐方式。 你必须以某种方式找到libc版本,然后你才能得到地址差异:

readelf -s /lib32/libc-2.19.so | grep printf

如果您知道两个地址,找到 libc 版本的可能方法:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 2023-03-06
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多