day01 攻防世界Window_Reverse1

攻防世界Window_Reverse1

1.发现是upx壳,使用手工脱壳

请添加图片描述

2.可以发现pushad,这是加壳前的表现,先保存现场,可以看见被push进去栈中的全部寄存,我们只要对这些数据下硬件访问断点,就可以发现这些数据什么时候被恢复。

在这里插入图片描述
在这里插入图片描述

3.可见popad指令,恢复现场,准备运行主程序

请添加图片描述

4.跳到程序主入口,dump下来,修复iat表,这个程序就能脱掉upx壳

请添加图片描述
请添加图片描述

修复IAT

请添加图片描述

在这里插入图片描述

5.我们可以看见我们输入的内容是v6,传给sub_401000函数,一开始我很很好奇,为啥这个下面有个v4地址与字符串作比较,v4如何传出来,为啥里面也有个v4。这个v4是sub_401000里面那个v4吗?

请添加图片描述

实际上ecx的v1就是函数外面v4的地址

请添加图片描述
请添加图片描述

我们输入123456它给我们替换成mlkjih,这个字符串将会使用ecx传出,

在这里插入图片描述

所以函数里的v1是ecx也就是替换成字符串以后的位置

在这里插入图片描述

6.我们先找出替换数组byte_402ff8

在这里插入图片描述

这是一种遍历数组的方式,因为v4是他们的差值,数组v1[v4]相当于input开头,随着v1不断被加一,遍历我们输入的值,最后把他们放在v1的地址里面,也就是我们看到ecx传出去的地址。

在这里插入图片描述

解密脚本

hexData=[
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7D,0xDF,0xBA,0x1A,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
]
s='DDCTF{reverseME}'
flag=''
for i in range(len(s)):
  flag+=chr(hexData[ord(s[i])])
print('flag{'+flag+'}')
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值