解题思路

该题主要是参照其他大佬writeup的思路,即找到输入,下断点,根据最后所得到的比较等式来一步步调试得到的。

VM

该函数应该是使用vm函数的地方

入口

因此在这个地方下了断点之后,一步步开始调试,看看程序的执行流程

首先,程序的执行到这个地方,会不断重复执行,然后根据调用的函数来获取输入、进行比较、执行输出。

在前几次的执行中,包含了获取输入的函数,得到我们的输入。

比较过程

获取输入后,程序开始执行比较,其中我也不太清楚部分操作的流程,可能是获取数据或者解析数据什么的,因此省略了。

获取input[i]的字符更新为input[i]-9。

sub dex,ecx

input[i]-9

获取操作数 0x26。

将input[i]与上一个函数获取的0x26异或,即input[i] = input[i] ^ 0x26。

xor edx,ecx

异或0x26

获取程序之前生成的Welcome字符串的第i个字符。

获取key

将获取Welcome字符串的字符和之前变化后的input[i]进行异或。

xor edx,ecx

异或key

执行add [eax], esi, 将上一步异或得到的的字符加上6。

add [eax], esi

变化

获取最后结果比较所需的数组。

结果数组

进行结果比较。

cmp edi,ecx

结果比较

解题脚本

1
2
3
4
5
6
7
8
9
10
11
12
result = [0x32, 0x26, 0x18, 0x21, 0x41, 0x23, 0x2A, 0x57, 0x44, 0x29, 0x35, 0x12, 0x20, 0x17, 0x45, 0x1C,
0x68, 0x2D, 0x7A, 0x79, 0x47, 0x7F, 0x44, 0x09, 0x1E, 0x75, 0x41, 0x2A, 0x19, 0x34, 0x76, 0x47,
0x14, 0x50, 0x52, 0x76, 0x58]
key = [0x57, 0x65, 0x6C, 0x63, 0x6F, 0x6D, 0x65, 0x5F, 0x74, 0x6F, 0x5F, 0x73, 0x64, 0x6E, 0x69, 0x73,
0x63, 0x5F, 0x32, 0x30, 0x31, 0x38, 0x5F, 0x42, 0x79, 0x2E, 0x5A, 0x65, 0x72, 0x6F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00]
flag = ''
for i in range(len(result)):
flag += chr(((result[i]-0x6) ^ 0x26 ^ key[i])+9)
print(flag)
#flag{_p1us_babyL0gin_pPpPpPpPp_p1us_}