因此,我尝试执行一个返回到libc,根据https://sploitfun.wordpress.com/2015/05/08/bypassing-nx-bit-using-return-to-libc/。
我通过使用"ldd vuln“找到libc的地址,并使用”read亲自-s /lib/i 386-linux-gnu/libc.so.x grep系统“找到系统的偏移量。
我很难在程序中的fflush命令中找到"sh“的地址。
我尝试了二进制的十六进制,并找到了"sh\x00“的偏移量,但是找不到二进制的基地址。
我不确定我找到的libc地址和系统偏移量是否有效,我也不知道如何找到"sh\x00“字符串的实际地址。
如果我发现地址的方式是错误的,请纠正我,我很乐意在查找字符串地址方面得到帮助:)
先谢谢各位:)
发布于 2017-08-26 22:49:52
首先,在处理问题之前,需要检查可执行文件是否在ASLR (https://en.wikipedia.org/wiki/Address_空格_布局_随机化)下运行,如果是这样的话,您需要找到从程序泄漏地址的方法,因为每次libc的地址都会不同。您可以轻松地通过运行gdb->b>info proc映射几次并比较偏移量来检查这一点。如果它们不同,您的可执行文件可能在ASLR下运行。假设没有ASLR保护,使用gdb-> base >info proc映射应该会给出libc的基本地址。为了找到要跳转到的函数的偏移量,您可以使用许多方法,但是使用readelf -s应该可以很好地工作--这将给出从SO基计算出的函数的偏移量( SO +偏移量=代码在运行时的位置)。
为了在运行时找到可执行模块的基址,您可以使用gdb或任何其他调试器并搜索可执行文件的入口点(或者在可执行文件加载到内存后搜索字符串.)。基本上,任何将您的可执行文件加载到内存并允许您查看内存的程序都可以。
linux下可执行文件的地址通常为64位可执行文件为0x400000,而gnu定义的32位可执行文件地址为0x08048000。但是没有什么能阻止别人把入口点改到不同的地址。
在您计算出内存映射之后,您需要在代码中找到小工具,我将把它留给您研究.https://en.wikipedia.org/wiki/Return-to-libc_攻打
也许你可以通过浏览习题来找到更多的答案,例如,protostar stack6应该处理ret2libc,您可以查找演练
编辑:似乎ldd并不总是给出正确的地址,它甚至忽略了在我的系统上禁用ASLR --使用gdb可能更好
发布于 2020-04-01 17:50:24
这里有两种方法: 1. strings -t x -a /path/to/libc | grep "/bin/sh"->它输出libc中字符串的偏移量。
libc_binsh=libc.search("/bin/sh\x00").next()定义libchttps://security.stackexchange.com/questions/168101
复制相似问题