常见魔改UPX
几篇大佬的文章:
https://cujo.com/blog/upx-anti-unpacking-techniques-in-iot-malware/
https://www.cnblogs.com/ichunqiu/p/7245329.html
https://bbs.kanxue.com/thread-275753.htm
https://www.52pojie.cn/forum.php?mod=viewthread&tid=326995
Header Structures
p_filesize
-
图一的p_filesize可以全部修改成0(图三也有p_filesize)
-
example [susctf mirai]
可以看到p_info中的p_filesize为0
找到第二段p_size位置有值,将0x2878的值放到0x00F4处即可-d解密.
overlay_offset
- overlay_offset位于文件尾部,是p_info的偏移值,当修改overlay_offset时直接-d会报错l_info(逆天,我感觉是p_info来着)
- example [basectf UPX PRO]
直接打开overlay_offset是
找到p_info的位置,为0xF4
将overlay_offset改为0xF4即可直接-d解密.
encsh程序(自改UPX+反调试)
-
因为运行发现有放调试,调用strace查看是否有调用ptrace()
strace ./encsh
-
确定存在可以用pwndbg确认位置.并且由于反调试在upx解压缩的过程中,需要先等upx自己mmap出来prace()的内存
gdb encsh catch syscall mprotect catch syscall ptrace vmmap //确定base_addr r //运行到断点 c //continue
- 之后找到mprotect的地址,在他后面下断点,之后运行到此位置后就可以进入ptrace()的地址,之后c出来syscall的代码,下断点rax == 0x65,之后运行,将rax置0,即可绕过反调试
- mprotect的地址是动态的
- ptrace()的地址不是....
- .....我也不知道为什么
- 之后在入口点下断点,run,之后确定循环解压位置(只看write的部分,32位一直写,等到出现一个确定的地址,而64位好像是以偏移显示),等走出循环,回到入口点,即可进入OEP,在此处下执行断点,将入口点的断点disable,再次断住,就是OEP,之后运行脚本dump_elf
- 之后找到mprotect的地址,在他后面下断点,之后运行到此位置后就可以进入ptrace()的地址,之后c出来syscall的代码,下断点rax == 0x65,之后运行,将rax置0,即可绕过反调试
-
得到dump.bin后,放入ida,找到ELF Dynamic Information,将此处代码u掉,之后运行脚本,将大于原先base_addr的部分减去原base_addr(脚本已经修复此处)
-
对于.got.plt section的部分需要手动清零,对应位置如下
-
需要修的程序对应的位置:
-
正常程序对应的位置:
-
将下面两处值清零:
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具