这是有关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文件(从远程系统获取)?
答案 0 :(得分:1)
但是,它使用的libc文件启用了ASLR,那么libc文件中system()的地址是否每次都会随机化?
是(假设您尚未通过其他方式禁用ASLR)。请注意,默认情况下,GDB禁用ASLR。如果要在GDB下运行程序时观察ASLR的影响,则需要set disable-randomization off
。
此外,如果我有另一个系统的libc文件,那么如何找到其中的system()地址?
那很容易:nm libc.so.6 | grep ' system'
。但是,这仅告诉您偏移量 {{1}之内,您还需要知道libc.so.6
在另一个系统上的加载位置。
This answer可能对您有所帮助。