首页
社区
课程
招聘
[原创]看雪CTF 秋季赛 第二题 writeup
发表于: 2017-10-26 22:13 2889

[原创]看雪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期)

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