一道题浅析LD_PRELOAD文件劫持 /proc/self/status反反调试
一道题浅析LD_PRELOAD文件劫持 /proc/self/status反反调试
这是Geekgame2025的一道逆向题,需要附件联系我
其中里面有打开/proc/self/status的反调试,对于这题来说很简单,我们修改stack或者patch直接让v1为0均可
但是为了学习,可以了解下LD_PRELOAD文件劫持实现反反调试
可以看下调试时的pid
对于本题很简单,ai直接给出脚本即可
1 | // hide_tracer.c |
要用IDA进行远程调试这里有个坑点就是
远程调试需要用这个命令去设置环境变量启动调试器,在Parameters里设置没有用!!!:
1 | gcc -shared -fPIC -o hide_tracer.so hide_tracer.c -ldl |
此外写出代码很简单,我们也需要了解背后机理:
当设置了 LD_PRELOAD=/path/to/hook.so 时,Linux 动态链接器在加载程序时会优先加载这个库,并把里面的同名函数符号放在最前面。
所以当程序调用 fopen() 时,**动态链接器解析符号时先找到库里的 fopen**,就直接调用你写的函数,而不是 libc 的版本。
符号解析顺序(优先级)大致如下:
- 主程序(main ELF)
LD_PRELOAD指定的库(最高优先)- 其他依赖库(按照 ELF 的依赖顺序)
- libc.so.6(系统 C 标准库)
- ld-linux 自身
在我们的代码中
1 | if (!real_fopen) { |
这行的作用是说:
找下一个名为
fopen的实现(也就是 libc 里的真正 fopen)
RTLD_NEXT 代表:
从当前库之后继续查找同名符号。
于是就能在 hook 函数里调用原版函数
1 | return real_fopen(path, mode); |
也就是说调试时会先找到我的fopen,调用我的这个函数,然后我去找真实的函数,并判断调用这个函数的path是否是/proc/self/status
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Matriy's blog!
评论




