今日连着遇到 UPX 魔改题,受不了了,于是把一个历史遗留问题解决了
UPX
Win下魔改
一般的压缩壳已经满足不了出题人了,于是出题人改了UPX段名,就比如说这样,这个.rsrc原来是个upx2
而改回去也要注意,就像这里是要把5个字节改成4个字节,最后一个字节标00,然后就可以正常脱壳,至于要改成什么样,可以随便拉一个exe加上upx壳对比一下即可,再者windows下的其实调试器很全,也很好动调脱下来
这题改成这样即可
Linux下魔改
首先精读文章
关键点
经过UPX处理后,压缩后的文件格式如下。
new eheader(64 bytes) (文件头)
- new pheader(56 bytes) * 3 (程序头表)
- l_info(12 bytes)
- p_info(12 bytes)
- b_info(12 bytes) + compressed block (原程序文件头和程序头表)
- b_info(12 bytes) + compressed block (第一个类型为PT_LOAD的段中除原程序文件头和程序头表的部分)
- b_info(12 bytes) + compressed block (第二个类型为PT_LOAD的段)
- ……
- fpad8 (8字节对齐)
- int(4 bytes) (第一个b_info的文件偏移)
- int(4 bytes) (当前位置的文件偏移,也就是之前所有数据总长度)
- loader (加载器,也就是脱壳代码)
- b_info(12 bytes) + compressed block (第一个PT_LOAD和第二个PT_LOAD中间的数据)
- b_info(12 bytes) + compressed block (第二个PT_LOAD和第三个PT_LOAD中间的数据)
- ……
- b_info(12 bytes) + compressed block (最后一个PT_LOAD到文件末尾之间的数据)
- 00 00 00 00 55 50 58 21 00 00 00 00 (b_info)
- fpad4 (4字节对齐)
- PackHeader(32 bytes)
- int(4 bytes) (p_info的文件偏移)
其中,b_info、l_info和p_info是三个结构体。
1 | // 在每个压缩块之前,存放压缩前和压缩后的数据大小 |
那么linux下的,gdb就算脱下来,符号什么的也没恢复,程序运行不了,这题又是rust写的,不调试太难逆了
这题也同样改了名字
然而改回来也不行,还改了一个地方,就是最后四个字节,看结构体可知最后四个字节是 p_info 的文件偏移
然而这边直接爆 0,工具脱不了是原因也就是这
那我们手动恢复一下即可,程序表头结束后+12的地方就是 p_info 的偏移地址
- new pheader(56 bytes) * 3 (程序头表)
- l_info(12 bytes)
- p_info(12 bytes)
于是找到是 F4,注意小端序填到第一个字节即可
🍬
🍪
About this Post
This post is written by P.Z, licensed under CC BY-NC 4.0.