首页
社区
课程
招聘
[原创] KCTF2021 第八题 众叛亲离
发表于: 2021-5-23 23:01 3653

[原创] KCTF2021 第八题 众叛亲离

2021-5-23 23:01
3653

第八题 众叛亲离 writeup

0x00 初步分析

程序为32位Windows控制台程序,无壳。题目使用了方案二,给出了一组公开用户名及序列号。作为输入,输入正确输出right;错误时输出error

0x01 静态分析

main函数较大,导致IDA无法反编译,只能看汇编了。在main函数前面是一大段初始化,接着读取 nameserial

之后开始对 nameserial 进行转换和验证:

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

0x02 动态分析

动态调试看最后产生的结果和判断,对应汇编代码在:

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

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

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

在断点处可以看到最后的结果即为原给出的正确的序列号 4107A2C5AA746C59F1D630E2B29E912C
因此最后我们可以将 KCTF00000001000200030004000500060007 作为输入,在断点处即可得到最后的正确序列号。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//