2024年天山固网杯Reverse方向部分Writeup
前言
WP仅供参考。
ezVM
直接拖进IDA
非常易懂的逻辑,只是将输入内容丢进了vm里处理
(取指令和处理指令)
自定义的指令:
方法是动态跟,以下是跟出来的指令含义:
指令 | 解释 |
---|---|
0x11xx | 读取key[xx],存到ax |
0x12xx | 读取input[xx],存到bx |
0x13xx | 将xx(作为立即数)存到bx |
0x21xx | 将ax存放起来 |
0x4100 | ax = ax ^ bx |
0x6100 | ax = ax + bx |
0x9000 | 结束标志 |
0x7000 | 结束标志 |
整理后指令:
可见大段重复指令,对应伪代码:
编写脚本:
data = [0x1D, 0x25, 0x22, 0x1D, 0x3F, 0x38, 0x43, 0x33, 0x36, 0x20, 0x17, 0x42, 0x3F, 0x48, 0x20, 0x3B, 0x65, 0x1E, 0x2F, 0x2E, 0x29, 0x6C, 0x28] #伪代码中edx指向地址,动调可得
data1 = list("YesYouFindtheVMKeyBravo") #伪代码中ecx指向地址,动调可得
a = ""
for i in range(len(data)):
a += chr(ord(data1[i]) ^ (data[i] - i)) # xor, add对应逆变换
print(a)
flag为DASCTF{E@sy_Vm_g0t_it!}
CheckYouFlag
分析
Qt写的程序,搜索字符串能找到成功提示:
函数上面有长得很像验证字符串的东西:
根据这个变量能找到下方有一处类似比较的循环:
如果都相同会跳转到LABEL_19,也就是上面成功提示处。
上方疑似和用户输入有关的内容:
可以看到,根据当前字符在字符串中的下标,选择不同的变换方式。
根据反编译代码写出脚本:
data1 = [0x40, 0xD8, 0x53, 0xDA, 0x50, 0xDF, 0x3B, 0xAB, 0x7C, 0xAC, 0x20, 0xA9, 0x20, 0xFB, 0x74, 0xAA, 0x22, 0xAF, 0x73, 0xFA, 0x2E, 0xAE, 0x20, 0xFC, 0x7F, 0xAE, 0x7D, 0xAA, 0x25, 0xFA, 0x21, 0xFA, 0x70, 0xFA, 0x73, 0xFF, 0x75, 0xAD, 0x23, 0xE4]
for i in range(len(data1)):
if i & 1 != 0:
data1[i] = chr(data1[i] ^ 0x99)
else:
data1[i] = chr((data1[i] ^ 0x66) + 30)
print("".join(data1))
flag为DASCTF{285d0db03b63cf7de7793acec4c3f14c}
(完)