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

    科技2023-12-03  76

    解题步骤

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

    Processed: 0.011, SQL: 8