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

本文介绍了如何处理UPX壳改区段名的问题,通过010editor修复UPX段名实现脱壳,并使用动态调试工具x32dbg配合ESP定律找到程序入口点,利用Scylla插件修复dump文件,最终成功获取程序的OEP。
摘要由CSDN通过智能技术生成

目录

一.查壳

二.修复upx区段名脱壳

三.动态调试脱壳

四.注意事项


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

一.查壳

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

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

二.修复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函数没有函数名

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

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

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OrientalGlass

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值