攻防世界re Windows_Reverse1

upx壳,进行脱壳

进入ida

逻辑比较清晰,但是有一个疑问,v4和DDCTF的字符串比较,但是在main中没有看见给v4赋值的语句,于是重点就落在sub_201000上,进入sub_201000

这里就有点摸不着头脑,不知道怎么进行下一步,有可能是指针给的地址相同,在sub_201000中做出了操作,但是下面的byte_202FF8是干什么的,进入byte_202FF8

里面并没有存放东西,应该是根据自己输入才会改变。‘

静态分析好像有一点难度啊,那就试试动态调试。

1.动态调试

看看汇编

看到2010CB的位置,ecx里面存放着比较的字符串,而要求经过函数处理的“DDCTF{reverseME}”字符串,再次处理后能和原来一样。而这时候就需要找到关键的call了,关注到2010C3的位置有call到sub_201000的,这不就是我们之前看见的函数?果断F2下个断点,进入动态调试

我输入进去111,在上面右侧的里面现在也是111,因为还没有进行处理

F8进行下一步

看见里面的1经过处理后变成了m。

那么是不是也就是说,我只需要把DDCTF的字符串输入进去,我得到的是不是就是flag了呢?尝试一下

上面经过处理后字符串,在下方地址由地位到高位存储,可以看到和上面右侧的值是一样的。手动输入

解题成功flag{ZZ[JX#,9(9,+9QY!}

2.静态分析

参考了别人的wp:https://www.cnblogs.com/demo41/p/18140896

重点需要搞明白两个部分:

1.v4的值是怎么样被传入的

2.sub_201000里面的过程是怎么样的

先来解决第一个问题

可以看到在scanf后,就把输入的数据给了eax

结合这一行,看出flag给了ecx,如下:

可以看到在sub_201000中,v1的值可能就存储在ecx寄存器里面,也就是flag(v4)的值存放的位置,第一个问题解决。

然后,可以看到 v4 = a1 - v1,也就是 a1 = v4 + v1,所以v4 + v1 表示的就是我们input的地址,再到第十五行,可以改写为 *v1 = byte_202FF8[(char)(v1+v4)] ,括号里面就是input的地址,不断++v1,所以可以看作对于input的遍历。结合转换的char类型,以及外面的byte_202FF8.也就是相当于input里面的每一个字符都被转换成了相应的ASCII码值作为偏移量,以byte_202FF8为基址开始寻址。

看byte_202FF8

0x202FF8 + 0x20 起始位置 0x202FF8 + 95 终止位置

正好就是最下面两个字符串,exp如下:

key1 = [ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x4E, 0xE6, 
  0x40, 0xBB, 0xB1, 0x19, 0xBF, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 
  0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 
  0x00, 0x00, 0x7E, 0x7D, 0x7C, 0x7B, 0x7A, 0x79, 0x78, 0x77, 
  0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70, 0x6F, 0x6E, 0x6D, 
  0x6C, 0x6B, 0x6A, 0x69, 0x68, 0x67, 0x66, 0x65, 0x64, 0x63, 
  0x62, 0x61, 0x60, 0x5F, 0x5E, 0x5D, 0x5C, 0x5B, 0x5A, 0x59, 
  0x58, 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4F, 
  0x4E, 0x4D, 0x4C, 0x4B, 0x4A, 0x49, 0x48, 0x47, 0x46, 0x45, 
  0x44, 0x43, 0x42, 0x41, 0x40, 0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 
  0x3A, 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 
  0x30, 0x2F, 0x2E, 0x2D, 0x2C, 0x2B, 0x2A, 0x29, 0x28, 0x27, 
  0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20, 0x00
]

key2="DDCTF{reverseME}"
flag=""
for i in key2:
  flag+=chr(key1[ord(i)])
print("flag{"+flag+"}")

flag{ZZ[JX#,9(9,+9QY!}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值