我有一个32位精灵程序,我必须远程利用(出于学术目的)。
最终目标是生成一个shell。我有一个堆栈,我可以填写我想要的任何数据,我可以滥用其中一个printf格式字符串。唯一的问题是没有导入system / execv / execvp。 .got.plt段中包含了非常有用的函数,我想用atoi
替换system
,因为它们的签名有多么相似,代码流表明这是正确的功能要更换。对于以下尝试,我使用了IDA远程调试,因此糟糕的堆栈对齐和不正确的格式字符串是不可能的。我想确保它是可行的,显然对我来说还不是。
首先,我尝试将atoi@.got.plt
替换为系统的非随机化地址。得到了SIGSEGV。
好吧,这可能是因为ASLR,所以让我们尝试别的东西。我加载了gdb并查找了system@0xb7deeda0
和atoi@0xb7de1250
。然后我计算了差异,即0xDB50。所以下次当我在.got.plt段中将atoi的地址更改为系统时,我实际上只是将diff添加到该值以获取系统的地址。再次得到了SIGSEGV。
我的逻辑:
0xb7deeda0 <__libc_system>
0xb7de1250 <atoi>
diff = 0xb7deeda0 - 0xb7de1250
system@.got.plt = atoi@.got.plt + diff
example: 0x08048726 + DB50 = 0x08056276
任何人都可以告诉我我做错了什么,如何在.got.plt
泄漏函数地址的帮助下跳转到“有效系统()”?
答案 0 :(得分:0)
回答我自己的问题。测量你的功能之间的距离 local libc不保证远程libc具有相同的对齐方式。 你必须以某种方式找到libc版本,然后你可以像这样得到地址差异:
readelf -s /lib32/libc-2.19.so | grep printf
如果您知道两个地址,可以找到libc版本: