Checkin(点击下载文件)
查壳脱壳
发现是upx壳我们直接使用工具脱壳
发现无法直接脱壳看样子是魔改的upx我们只能手动脱壳
将程序放入x32dbg
点击上面的调试后点击运行
进入这个界面看到pushad就可以确定是有壳了,我们按f8单步运行至mov指令。
右击左侧ESP
选择在转储中跟随
右击左下角选择如上操作后按f9让程序跑起来
然后一直按f8直到程序第一次跳转后再按f8 就是找到了程序入口
点击如下按钮
选择dump
取名字保存之后依次选择
选择刚刚重命名的文件,就可以看到桌面上出现了,就是脱壳成功了
IDA分析
shift+f12找到该字符串交叉应用到关键函数
发现该段函数没有被声明
讲红色部分全部框住然后按p声明之后进入函数
当sub_F312c6返回值为1时输出text的内容内容为“you are good”
我们只需要进入sub_F312c6中查看
出现花指令 nnd,进去看看
选中红色这行然后按tab
红色部分全部nop掉然后将call函数转化为data
再把数据E8用nop填充然后逐行按c转化为代码
(这里直接nop会从E8变成90,我们需要先把90单独按c转化为nop指令)
接下来发现下面还有红色的部分也是按照上面的操作类似操作
所有类似于
这样的数据都按c转化为汇编代码
操作到这里然后把上面的代码都括住按p声明
然后按f5反编译为伪代码
根据伪代码内容写wp
EXP
#include<iostream>
using namespace std;
int a[257] = {0}; //v16+1228
int b[257] = {0}; //v16 +20
char v16[10] = "flechao10";
char v13[4] = "#<#";
int v12[257]={0};
int main()
{
v12[0] = -125;
v12[1] = 27;
v12[2] = -14;
v12[3] = 75;
v12[4] = -81;
v12[5] = 1;
v12[6] = 5;
v12[7] = 35;
v12[8] = 57;
v12[9] = 93;
v12[10] = -94;
v12[11] = -101;
v12[12] = -110;
v12[13] = -15;
v12[14] = -99;
v12[15] = -35;
v12[16] = -35;
v12[17] = -103;
v12[18] = -68;
v12[19] = 119;
v12[20] = -53;
v12[21] = 25;
v12[22] = 114;
v12[23] = -27;
v12[24] = 100;
v12[25] = 47;
v12[26] = -42;
v12[27] = 62;
v12[28] = 15;
v12[29] = 18;
v12[30] = 5;
v12[31] = 108;
v12[32] = -112;
v12[33] = 48;
v12[34] = -73;
v12[35] = 2;
v12[36] = -58;
v12[37] = -48;
v12[38] = 0xE8;
v12[39] = 0x23;
v12[40] = 0x3C;
v12[41] = 0x23;
int v15[257] = {0};
for(int i = 0 ; i < 50 ; i ++ )
{
v15[i+1]=v12[i];
}
for(int i = 0 ; i < 256 ; i++ )
{
a[i]=v16[i%9];
b[i]=i;
}
int v10 = 0,v8;
for(int i = 0 ; i < 256 ; i++ )
{
v10 = (a[i]+b[i]+v10)%256;
v8 = b[i];
b[i]=b[v10];
b[v10]=v8^0x37;
}
int v5 = 0 ,v11 = 0 ;
int v9 = 0;
for(int i = 0 ; i < 50 ; i++ )
{
v5 = (v5+1)%256;
v11 = (b[v5]+v11)%256;
v9 = b[v5];
b[v5]=b[v11];
b[v11]=v9;
v15[v5]^=b[(b[v11]+b[v5])%256];
}
for(int i = 0 ; i < 42; i ++ )
{
printf("%c",v15[i+1]);
}
}
//