目录
一.查壳
二.修复upx区段名脱壳
三.动态调试脱壳
四.注意事项
题目附件:https://pan.baidu.com/s/1KXNvwOd7WObU-LiikiOd8A?pwd=4l31
提取码:4l31
刚做这题时感觉非常奇怪,怎么是ZVM壳,查了半天也没个头绪,还以为是压缩+虚拟保护壳
如果直接用upx脱壳会失败,后来才知道这是upx壳改了upx区段名,其实exeinfope这里也找到了upx的特征,已经有过提示
用010editor打开可以看到区段表这里有ZVM0,ZVM1,.rsrc三个段.如果对区段表不了解可以学习一下PE文件结构,这里引用大佬文章手动去upx特征的一段解释:
"UPX0和UPX1是加UPX壳后的两个区段名。其中UPX1区段包含了需要解压的数据块。.rsrc是程序资源信息区段名,这个区段含有原资源段的完整头部以及图标、Manifest、版本等未被压缩的资源,当然还有UPX自身需要的导入信息等(如果程序自身不含资源段,加壳后就是UPX2)。UPX0和UPX1可以被随意改成任何字符串,虽然这样改用处不大,但是也能起到伪装的作用。"
所以这里是一个伪装
手动修复UPX段名并保存
此时可以正常识别为UPX壳,再试试脱壳
成功脱壳
ida32打开可以看到程序逻辑,这题只是一个rc4加密
不难得到flag:
关于动态调试脱upx壳主要就是ESP定律,不知道的同学可以查一查其他大佬的文章
推荐几篇文章可以大概了解一下:
1.CTFWiKi 保护壳简介
2.BUUCTF 新年快乐(xdbg手动脱壳)
3.BUUCTF Reverse 新年快乐(手工去壳)
4.BUUCTF 新年快乐(xdbg手动脱壳)
5.RE套路/从crackme学nsPack手动脱壳
用x32dbg或者od打开
按f8,选中右侧的ESP寄存器,右键选择在内存窗口中转到内存1
在内存窗口中选中最前面四个字节,右键断点>硬件,访问,几字节随便
按f9运行,程序停在7fc0处(pushad),按f2下一个断点 ,这里就是UPX开始解压程序的入口点
按f8,然后按照上面的操作,再给esp指向的内存单元下一个硬件访问断点
按f9运行,可以发现程序停在了816f处,这里有popad,栈平衡以及jmp指令(跳转到153f处,很显然是大跳转,应该是跳转到oep)
下断点然后运行到817c处,按f7跟进
这里应该就是程序的入口点处,我们打开自带的Scylla插件
先点IAT Autosearch,再点Get Imports(可以发现这里有一个错误提示,先忽略),最后点Dump保存dump后的程序
保存完之后点Fix Dump修复刚刚的错误即可
最后生成的uppppx_dump_SCY就是我们需要的程序,用ida32打开即可,和上方修改区段名得到的程序内容一致
这个程序需要下两次硬件断点才能找到oep,老的upx加壳程序上来就可以找到pushad指令,但是这个程序刚运行时没有pushad指令,所以需要先找到pushad所在位置
如果不用fix dump修复dump的程序会导致一些错误
首先是memset函数没有函数名
点进去之后会发现是函数指针,但是根本不知道函数的功能,只能靠猜
这里个人推测应该是因为没有修复导入表,导致一些库函数没有被正常重定位