示例为 [SWPUCTF 2022 新生赛]upx 中的附件(64位,UPX3.96壳),可以用工具脱壳。下面尝试手动脱壳。
XP后的系统都有ASLR(地址空间随机化),导致dump后程序运行出错,因此我们首先用CFF Explorer修改该文件的Nt Header,禁用ASLR
在Nt Header下的Optional Header里修改Characteristics,勾选Relocation info srtipped from file。关闭后记得保存。
用x64dbg打开文件,进入系统断点(push rbx)。
按F9到达该断点(这里要按两次,上面还有个别的什么断点)
F7走完push压栈部分
观察到RSP的变化,在其上右键“在内存窗口中转到”
在右下角该地址右键,设置硬件断点
F9运行到断点处,看到下面的jmp大跳应该是入口,设置断点,F9跳过去
F7步入程序
往下翻可以看到提示字符串
这就正式进入了原程序,可以进行dump了
先点“IAT Autosearch”,再点“Get Imports”,在“Imports”中删除掉带有红色叉叉的,再点击“Dump”,之后“Fix Dump”选中之前的Dump文件,修复成功。
p04 副本_dump_SCY.exe 也可以正常运行
拖入IDA中,这里会不报错,Yes不用管它
(由于某种神秘力量?)没有main函数,只能通过字符串来找函数
X键找一下位置
可以看到大致的代码
如果想把字符串展开看,可以(退到IDA View-A中)修改Segment,取消w勾选
修复后
显然sub_140001540是printf函数,脱壳结束