解题步骤
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,利于分析;文本样式并不利于分析。伟大的工具。