HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳

目录

一.查壳

二.修复upx区段名脱壳

三.动态调试脱壳

四.注意事项


题目附件:https://pan.baidu.com/s/1KXNvwOd7WObU-LiikiOd8A?pwd=4l31 
提取码:4l31

一.查壳

刚做这题时感觉非常奇怪,怎么是ZVM壳,查了半天也没个头绪,还以为是压缩+虚拟保护壳

如果直接用upx脱壳会失败,后来才知道这是upx壳改了upx区段名,其实exeinfope这里也找到了upx的特征,已经有过提示

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第1张图片

二.修复upx区段名脱壳

用010editor打开可以看到区段表这里有ZVM0,ZVM1,.rsrc三个段.如果对区段表不了解可以学习一下PE文件结构,这里引用大佬文章手动去upx特征的一段解释:

"UPX0和UPX1是加UPX壳后的两个区段名。其中UPX1区段包含了需要解压的数据块。.rsrc是程序资源信息区段名,这个区段含有原资源段的完整头部以及图标、Manifest、版本等未被压缩的资源,当然还有UPX自身需要的导入信息等(如果程序自身不含资源段,加壳后就是UPX2)。UPX0和UPX1可以被随意改成任何字符串,虽然这样改用处不大,但是也能起到伪装的作用。"

所以这里是一个伪装

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第2张图片

手动修复UPX段名并保存

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第3张图片

此时可以正常识别为UPX壳,再试试脱壳

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第4张图片

成功脱壳

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第5张图片

ida32打开可以看到程序逻辑,这题只是一个rc4加密

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第6张图片HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第7张图片

不难得到flag:

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第8张图片

 

三.动态调试脱壳

关于动态调试脱upx壳主要就是ESP定律,不知道的同学可以查一查其他大佬的文章

推荐几篇文章可以大概了解一下:

1.CTFWiKi 保护壳简介

2.BUUCTF 新年快乐(xdbg手动脱壳)

3.BUUCTF Reverse 新年快乐(手工去壳)

4.BUUCTF 新年快乐(xdbg手动脱壳)

5.RE套路/从crackme学nsPack手动脱壳

用x32dbg或者od打开

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第9张图片

 按f8,选中右侧的ESP寄存器,右键选择在内存窗口中转到内存1

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第10张图片

在内存窗口中选中最前面四个字节,右键断点>硬件,访问,几字节随便

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第11张图片

按f9运行,程序停在7fc0处(pushad),按f2下一个断点 ,这里就是UPX开始解压程序的入口点

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第12张图片

按f8,然后按照上面的操作,再给esp指向的内存单元下一个硬件访问断点

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第13张图片

按f9运行,可以发现程序停在了816f处,这里有popad,栈平衡以及jmp指令(跳转到153f处,很显然是大跳转,应该是跳转到oep)

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第14张图片

下断点然后运行到817c处,按f7跟进

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第15张图片

这里应该就是程序的入口点处,我们打开自带的Scylla插件

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第16张图片

先点IAT Autosearch,再点Get Imports(可以发现这里有一个错误提示,先忽略),最后点Dump保存dump后的程序

保存完之后点Fix Dump修复刚刚的错误即可

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第17张图片

最后生成的uppppx_dump_SCY就是我们需要的程序,用ida32打开即可,和上方修改区段名得到的程序内容一致

这个程序需要下两次硬件断点才能找到oep,老的upx加壳程序上来就可以找到pushad指令,但是这个程序刚运行时没有pushad指令,所以需要先找到pushad所在位置

四.注意事项

如果不用fix dump修复dump的程序会导致一些错误

首先是memset函数没有函数名

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第18张图片

点进去之后会发现是函数指针,但是根本不知道函数的功能,只能靠猜

这里个人推测应该是因为没有修复导入表,导致一些库函数没有被正常重定位

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第19张图片

HZNUCTF REVERSE Signin题解——upx壳区段改名修复,动态调试脱壳_第20张图片

你可能感兴趣的:(Reverse,经验分享,学习,Reverse,UPX脱壳,CTF)