加载期间转储进程内存布局

逆向工程 仪器仪表 二进制编辑
2021-06-19 13:35:59

我正在开发一个项目,我需要使用该项目LD_PRELOAD将一些库加载到内存空间中。

就像是:

 LD_PRELOAD="./libapp.so" ./my_app

由于某些原因(我实际上正在研究一些二进制黑客),我必须知道某些函数(例如,的内存地址(不是符号)在执行前检测二进制代码foolibapp.somy_app

但是,由于ASLR(地址空间布局随机化),每次libapp.so都会被加载到不同的内存地址,我无法知道foo执行前的内存地址

我想以某种方式拦截加载时间,读出 的内存地址libapp.somy_app使用 的内存地址执行一些检测foo,然后加载my_app到内存空间。

所以这里是我的问题:如何拦截加载过程并获取libapp.so?

1个回答

我认为一种选择可能是使用ptrace,例如您可以使用_dl_open()代替LD_PRELOAD. 看这个例子:

另一种选择可能是gdb用于执行此操作,例如您可以将挂起的断点设置为 foo 然后运行程序。

另一种选择是关闭 ASLR,您可以使用 /proc/sys/kernel/randomize_va_space

要禁用它,您可以运行:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space