这是有关ASLR的一个基本问题。
如果我有一个没有启用ASLR的二进制文件。然而,它使用的libc文件已经启用了ASLR,那么每次在libc文件中的system()地址会被随机化吗?
或者地址每次都是一样的,因为主二进制本身没有启用ASLR?
在gdb中,我获取system()函数的地址,如下所示:
(gdb) break main
(gdb) run
(gdb) print &system那么,这是从libc还是主二进制的PLT返回system()的地址呢?
另外,如果我有来自另一个系统的libc文件,那么如何在其中找到system()的地址呢?通过defaut,如果我在我的主二进制文件上运行gdb,它将在本地系统上找到libc的system()地址。我是否必须告诉gdb加载libc文件(我从远程系统获得了该文件)?
发布于 2018-12-07 03:53:32
然而,它使用的libc文件已经启用了ASLR,那么每次在libc文件中的system()地址会被随机化吗?
是的(假设您没有通过其他方式禁用ASLR )。注意,GDB默认禁用ASLR。如果要在GDB下运行程序时观察ASLR效应,则需要set disable-randomization off。
另外,如果我有来自另一个系统的libc文件,那么如何在其中找到system()的地址呢?
这很简单:nm libc.so.6 | grep ' system'。但是,这只会告诉您libc.so.6中的偏移量,您还需要知道libc.so.6在其他系统上的加载位置。
This answer可能对你有帮助。
https://stackoverflow.com/questions/53644733
复制相似问题