[Reverse]首届“天权信安&catf1ag”网络安全联合公开赛checkin


Checkin(点击下载文件)

查壳脱壳

file
发现是upx壳我们直接使用工具脱壳
file
发现无法直接脱壳看样子是魔改的upx我们只能手动脱壳
将程序放入x32dbg
file
点击上面的调试后点击运行
file
进入这个界面看到pushad就可以确定是有壳了,我们按f8单步运行至mov指令。
file
右击左侧ESP
file
选择在转储中跟随
file
右击左下角选择如上操作后按f9让程序跑起来
然后一直按f8直到程序第一次跳转后再按f8 就是找到了程序入口
file
点击如下按钮
file
file
选择dump
file
取名字保存之后依次选择
file
file
选择刚刚重命名的文件,就可以看到桌面上出现了,就是脱壳成功了
file

IDA分析

shift+f12找到该字符串交叉应用到关键函数
file
发现该段函数没有被声明
file
讲红色部分全部框住然后按p声明之后进入函数
file
当sub_F312c6返回值为1时输出text的内容内容为“you are good”
我们只需要进入sub_F312c6中查看
file
出现花指令 nnd,进去看看
选中红色这行然后按tab
file
红色部分全部nop掉然后将call函数转化为data
file
再把数据E8用nop填充然后逐行按c转化为代码
(这里直接nop会从E8变成90,我们需要先把90单独按c转化为nop指令)
接下来发现下面还有红色的部分也是按照上面的操作类似操作
所有类似于
file
这样的数据都按c转化为汇编代码
file
操作到这里然后把上面的代码都括住按p声明
然后按f5反编译为伪代码
file
根据伪代码内容写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]);
	}
}
//
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值