首页
社区
课程
招聘
[原创]看雪CTF 2016第24题分析
发表于: 2016-12-18 20:15 3086

[原创]看雪CTF 2016第24题分析

2016-12-18 20:15
3086

1、定位校验位置
这题的唯一特点是验证码特别长,无加壳混淆、无反调试,校验分两个部分,下图标出了关键点,其一是全局变量g_Mark_5982E4必需为0,其二是Check2函数的第4个参数v22和返回值v16必需相等。
 
2、第一个检测点
在sub_403510函数内找到了如下关键代码,当strcmp匹配成功返回0时,v3为0,v5为真,v4赋值为-1,然后g_Mark_5982E4=v4,最后退出之前++g_Mark_5982E4得到0,满足第一个条件。
 
动态调试在strcmp的位置下断,发现是输入的前5个字符和“pediy”字符匹配,如下所示
 
可以确定前5个字符为pediy, 验证能走到下一步流程。
3、第2个检测点
下图是检测点的反编译代码,需要返回值与第4个输入参数相等 
 
经测试,该参数恒定为0x9C
 
第1个条件是第二个参数也必需等于第4个参数,否则返回0。而第二个参数与输入字符个数有关系,是(strlen(input)-5)的一半。
第2个条件是校验数组CheckBuf[]与输入数组InputBuf[]之间需要满足如下关系:
  CheckBuf[i]==InputBuf[i]–0x30,i从0到0x9b;
下图是校验数组:CheckBuf的数据
 
下图是输入数组InputBuf,与输入相关,根据输入计算得到。

InputBuf是通过输入字符计算得到,每个InputBuf由2个输入字符计算得来,这些输入字符限定在0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,A,B,C,D,E,F;这些字符将对应16进制数0x0到0xf,下图的编码信息能够猜测到本结论。

InputBuf[i]是将第5个字符之后的输入映射到0x0~0xf之后,通过公式(16*c1+c2)xor0x86计算得到,如下反编译代码所示。2个字符一组,得到一个inputBuf[i];

算法理清楚之后写出如下代码计算注册码


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回