-
-
[原创]看雪CTF 秋季赛 第二题 writeup
-
发表于: 2017-10-26 22:13 2889
-
这个题目思路极其独特,看似简单的题目,背后居然隐藏了怎么大的秘密。
刚开始打开IDA的时候,代码极其简单,很兴奋,感觉又好像是一道类似签到题。
void sub_401090(){ int v0; // [sp+4h] [bp-8h]@0 int v1; // [sp+8h] [bp-4h]@0 if ( v1 && v0 && v1 != v0 && 5 * (v1 - v0) + v1 == 0x8F503A42 && 13 * (v1 - v0) + v0 == 0xEF503A42 ) --checkcode; }
以及
void sub_4010E0(){ int v0; // [sp+4h] [bp-8h]@0 int v1; // [sp+8h] [bp-4h]@0 if ( v1 && v0 && v1 != v0 && 17 * (v1 - v0) + v1 == 0xF3A94883 && 7 * (v1 - v0) + v0 == 0x33A94883 ) --checkcode; }
void sub_4010E0(){ int v0; // [sp+4h] [bp-8h]@0 int v1; // [sp+8h] [bp-4h]@0 if ( v1 && v0 && v1 != v0 && 17 * (v1 - v0) + v1 == 0xF3A94883 && 7 * (v1 - v0) + v0 == 0x33A94883 ) --checkcode; }
只需要将两次的if语句都算正确即可。
6 * a - 5 * b = 0x8F503A42(s1) 13 * a - 12 * b = 0xEF503A42(s2) 18 * a - 17 * b = 0xF3A94883(s3) 7 * a - 6 * b = 0x33A94883(s4)
按照常规的数学运算,a和b是能够通过多个等式求出来的 即使求出来的解不是很准确,但是最多也就最高位上的值不是很准确
a = s4 * 2 - s2 a = s1 + s2 - s3 b = (s1 * 3 - s3) / 2 b = s1 + s4 - s2
通过两中方式求出来的a,b差距很大, 而且看 数值 0xF3A94883 ≈ 0x33A94883 , 0x8F503A42 ≈ 0xEF503A42。
所以说可能是有诈,并且没有说明输入的字符长度为8。
后发现该程序存在栈溢出漏洞,作者可能利用这一点将真正的代码验证端放到之后。并且OD加载的初始位置和这段代码之间的间隔了很多的空数据。 找到空数据结束的位置 0x413131 。 推测可能为程序真正的代码验证块。
0018FF34 0041B08C ASCII "%s" 0018FF38 0018FF3C ASCII "aaaabbbbcccc11A" 0018FF3C 61616161 0018FF40 62626262 0018FF44 63636363 0018FF48 00413131 ctf2017_.004131310018FF4C 00413E3E 返回到 ctf2017_.00413E3E 来自 ctf2017_.00401000
直接覆盖返回地址为00413131 即输入12个字符+11A
之后代码后很多花指令,乱跳转,但是目的都只有一个,是用来验证输入的code。
使用调试软件直接动调将一句一句代码扣下来, 因为全是跳转语句,刚开始在验证的跳转处没有识别出来,然后遇到了挫折。后来发现主要的跳转有一个特点就是跳转很长。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
看原图
赞赏
雪币:
留言: