-
-
[原创] KCTF2021 第八题 众叛亲离
-
发表于:
2021-5-23 23:01
3800
-
程序为32位Windows控制台程序,无壳。题目使用了方案二,给出了一组公开用户名及序列号。作为输入,输入正确输出right
;错误时输出error
。
main
函数较大,导致IDA无法反编译,只能看汇编了。在main函数前面是一大段初始化,接着读取 name
和 serial
:

之后开始对 name
和 serial
进行转换和验证:
serial
长度为 32,只能为 0~9、A~F ,每两字节作为 hex 转为一字节
name
与在前面初始化过的16字节进行异或操作
接下来作者实现了一套虚拟机,利用前面初始化的数据作为代码运行。跟了一部分代码,看不出主要逻辑以及对输入的操作,鉴于个人能力以及没什么头绪,尝试其它方法。故进行动态调试看最后产生什么结果并做出了什么判断吧。
动态调试看最后产生的结果和判断,对应汇编代码在:

将所给的用户名及序列号作为输入,在 0x41a9a7 处下断点之后在 [ecx - 1] 处看到处理后的结果:

最后结果为:0到7,各占2字节。
尝试将序列号输入的前两个字符改成其它,再次下断点后看到:

可以看到修改输入的前两个字符,仅对最后结果的 第一个字节
产生影响,不对后面产生影响,可知处理的算法仅对当前某几个字节处理。
再次修改输入的序列号为上述得到处理后的结果00000001000200030004000500060007
作为输入:

在断点处可以看到最后的结果即为原给出的正确的序列号 4107A2C5AA746C59F1D630E2B29E912C
。
因此最后我们可以将 KCTF
和 00000001000200030004000500060007
作为输入,在断点处即可得到最后的正确序列号。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课