如何让GDB为开启ASLR的远程无符号进程自动重基设断点?
解决GDB远程调试ASLR进程自动设置断点的方法
其实GDB本身就支持自动处理ASLR带来的基址偏移问题,不用手动计算,以下是几种实用方案:
直接通过函数名设置断点(推荐)
只要调试的进程编译时带有调试符号(编译参数加-g),或者本地GDB加载了对应可执行文件/库的符号文件,直接执行命令:break 函数名GDB会自动读取远程进程的内存映射信息,计算ASLR导致的基址偏移,定位到函数的实际内存地址并设置断点。
针对无调试符号但有动态符号的二进制
如果目标程序没有调试符号,但保留了动态符号表(默认编译不会去掉),可以直接通过符号名加星号的方式设置断点:break *函数名比如要给
printf设断点,执行break *printf即可,GDB会从远程进程的动态符号表中解析出函数的实际地址。手动指定符号文件与基址(极端情况)
如果远程进程的库或可执行文件本地没有,或者符号表被剥离,可以先通过远程的/proc/PID/maps获取加载基址,然后在GDB中加载符号文件并指定基址:add-symbol-file /path/to/local/library.so 0x基址加载完成后,依然可以用函数名设置断点,GDB会自动计算偏移。
另外,远程调试时确保本地GDB连接后,执行set solib-search-path /path/to/remote/libs,让GDB能找到远程进程加载的库文件,这样符号解析会更准确。
内容的提问来源于stack exchange,提问作者Kokomelom
相关产品推荐
相关产品推荐

