vm类型题目(3) hagem-week4-easy

解题步骤

1.题目打开并定位到sub_140001180(查找字符串 error)

2.有一堆的代码混淆,我们可以看到在末端

3.进入sub_1400017D0函数,看看

是一道vm题,各种switch case

4.查看F5后的代码,模拟了栈的push pop操作

这是动态调试后看出来的。具体如下:

sub_140001000借用一下大佬的说明

5.之后继续动态调试,发现在loc_140001963 处有计算

 

 6.整体调试下来,其实只有该处有xor运算。所以,我们可以通过输入40个1,调试找到地址000000000014FEBB附近是存放输入和最终结果的地方,在ret下断。把数据复制出来。之后把数据跟"1"异或,得出用来异或计算的值。(学到了,大佬们真聪明)

7.用来异或计算的值跟数组进行比较,得出flag

脚本

end = [0x63, 0x02, 0x7F, 0x76, 0x7B, 0x7C, 0x56, 0x58, 0x76, 0x41, 0x5B, 0x07, 0x1B, 0x60, 0x07, 0x1B,
0x6F, 0x07, 0x65, 0x56, 0x7F, 0x12, 0x71, 0x44, 0x6F, 0x55, 0x02, 0x50, 0x09, 0x7A, 0x03, 0x79,
0x67, 0x76, 0x47, 0x7E, 0x52, 0x40, 0x15, 0x68] # 导出的数据
xor = []  # 异或的值
for x in end:
    xor.append(x ^ ord("1"))
print(xor)
print(len(xor))
cipher = [58, 84, 47, 42, 47, 54, 19, 1, 46, 3, 53, 64, 71, 14, 95, 89, 1, 105, 39, 8, 61, 76, 51, 26, 45, 11, 64, 14, 75, 36, 65, 39, 37, 40, 41, 42, 2, 2, 93, 36]
for i in range(40):
    print(chr(cipher[i] ^ xor[i]), end='')

# hgame{this_vm_is__sosososososososo_easy}

总结

1.模拟栈的操作的骚操作(数据结构)->实现数据结构。

2.F5在看代码时有点静态混淆,都不容易看。动态调试起来。

3.边调试边看graph,利于分析;文本样式并不利于分析。伟大的工具。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值