ctf逆向中的工具脱壳和手动脱壳

目录

upx脱壳

示例一

upx脱壳工具

动态调试脱壳

ollydbg、xdbg下载: dbg

示例二

例题附件


(例题附件放在了文章最后)

upx脱壳

        脱壳就是将外面的保护程序脱掉,看到里面的程序。对于有壳的程序,每次程序的入口点总是从壳开始,这个入口点是EP,那么源程序的入口点是OEP,壳将真正的OEP隐藏了,我们脱壳就是修改程序的入口点。

示例一

upx脱壳工具

1.将exe文件拖到exeinfope里面查壳

2.有upx壳,用upx解壳,在upx所在目录输入cmd打开终端,在终端输入

upx -d [完整文件路径]

解壳成功,出现如下界面

如果没有成功,那可能是改了区段名 

 用010editor打开,查找区段

然后修改变化的地方(有时候是大写的UPX,要根据Exeinfo来),保存文件,上述相同步骤解壳

将解壳后的文件拖进ida,分析主函数

写出解密代码

#include<iostream>
using namespace std;
int main(){
    string s="ek`fz`abcdefg|";
    for(int i=0;i<14;i++)
        s[i]++;
    cout<<s;
}
//flag{abcdefgh}

动态调试脱壳

        手动脱壳,顾名思义就是不使用工具脱壳,而是直接脱壳,一般是利用ESP定律,使用ollydbg、xdbg等动调工具和他们附带的插件进行脱壳。

        ESP:是汇编语言里面的栈指针寄存器,它指向栈的顶端,出栈和入栈都需要用到它。加壳的原理:在加壳程序中,壳程序会将原始程序的代码压缩、加密或进行其他处理,然后嵌入到一个外部包装壳中。壳程序在启动时会先解压、解密或还原原始程序,再将控制权交给原始程序的入口点(OEP)。

        ESP定律:壳程序在启动时,一般会压入一些解压需要 的参数,压入参数时,ESP会发生改变。为了保证堆栈平衡,在解压完成时,ESP会恢复到压入参数之前的位置,然后跳转到程序入口点开始执行代码。可以此为标志,判断是否到达程序入口点。

ollydbg、xdbg下载: dbg

        注意:ollydbg只能调试32位程序,如果要调试64位程序只能用x64dbg

示例二

查壳,32bit 

拖进x32dbg,打开的黑框不要关掉,否则会退出调试

这是xdbg的一些快捷键 

F7

单步步入,会进入函数

F8

单步步过,不进入函数

F4

运行到光标处

;

添加注释

F2

设置或取消断点

F9

运行直到遇到断点

ctrl+F2

重新开始调试

F9先走到如下界面,一般的加壳程序一开始就是一个push指针

一开始栈顶寄存器ESP值为61FF78,程序自动脱壳后会回到这个位置,按F8单步调试将(所有寄存器的值包括)这个地址压入栈中,使得ESP值为61FF58,于是我们将其从内存窗口中转到内存1

转到内存1窗口后右键,设置断点(这个无论1,2,4字节都可以)

我们按F9运行到断点,即当程序回到这个位置时,就解压完成了,不过这个位置还不是程序的入口点,F8继续往下,遇到一个死循环

不过没关系,在循环下面设个断点,按F4进入

这里有一个很大的跳转,一般遇到大跳转就是到了程序的入口点 

F8到了程序入口点,这里有个dump插件,点击dump保存文件 

但是这个文件还不能用,要进行修复,即IAT

点击Get I得到修复地址 

点击Fix D进行将刚刚得到的文件进行修复 

生成一个新的文件,这个文件一般就是脱壳成功的 

双击没什么问题 

拖进ida分析

和上面一样解密就可以了

例题附件


逆向脱壳,你学会了吗 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值