首页
论坛
课程
招聘
[原创]2017CTF秋季赛 第二题 ctf2017_Fpc 解题报告
2017-10-27 22:48 1582

[原创]2017CTF秋季赛 第二题 ctf2017_Fpc 解题报告

2017-10-27 22:48
1582

伪方程

题目乍看起来是这个流程:

  • 录入 8个字符
  • 令 v0 = (DWORD)前4个字符 v1 = (DWORD)后4个字符
  • 求方程组:
    1. 17 * (v1 - v0) + v1 == 0xF3A94883
    2. 7 * (v1 - v0) + v0 == 0x33A94883
    3. 5 * (v1 - v0) + v1 == 0x8F503A42
    4. 13 * (v1 - v0) + v0 == 0xEF503A42

其实这是作者的坑,此题是无解的方程

线索1

当我测试输入字符串个数的时候,输入 12 个字符时,程序又从头执行了

 

原因是:12 个字符后的 '\0' 覆盖了返回地址,使其变成 0x401000 从头开始了

线索2

我想:既然程序有判断 [0x41B034] 这个地方的值来作为成功标志,是不是能用 线索1 修改到别的流程上更改这个地方的值呢

 

IDA bytes 搜索 34 b0 41 00 (0x41B034 地址,查看有没有指令有关)

 

搜索结果

考点

IDA 做微量指令修复时,要关掉这2个地方减少 IDA 智能分析的影响

 

选项

切入点

修复第一处指令,发现这个混淆经过了很多跳转

 

修复结果1

 

顺着来源跳转向上一路修复,找到根源

 

根源

 

因为这里没有来源跳转,并且 add esp, 0FFFFFFF0h 非常重要,后文的调试中,大家会发现,与 pop eax 组合,能取出输出的 12 个字符

解决

综合以上,剩下的就要调试了

 

输入 11113333777711A,前面 12个字符取这个,调试时运算比较明显,最后的 11A\0 就是地址 0x00413131 “根源”

 

很容易调试出如下方程:

  1. ((v0 - v1) * 4) + v0 + v2 = 0xEAF917E2
  2. ((v0 - v1) * 3) + v0 + v2 = 0xE8F508C8
  3. ((v0 - v1) * 3) + v0 - v2 = 0x0C0A3C68

解得:

  • v0 = 0x7473754a
  • v1 = 0x726f6630
  • v2 = 0x6e756630

转换成字符串后为题解


[培训]12月3日2020京麒网络安全大会《物联网安全攻防实战》训练营,正在火热报名中!地点:北京 · 新云南皇冠假日酒店

收藏
点赞2
打赏
分享
最新回复 (2)
雪    币: 3117
活跃值: 活跃值 (16)
能力值: ( LV15,RANK:1395 )
在线值:
发帖
回帖
粉丝
lacoucou 活跃值 12 2017-10-29 22:21
2
0
雪    币: 37
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:41 )
在线值:
发帖
回帖
粉丝
xinali 活跃值 2017-11-6 22:36
3
0
原因是:12 个字符后的 '\0' 覆盖了返回地址,使其变成 0x401000 从头开始了
作为新手,可能是write up没表达清楚,看的我一头雾水,这里注释一下,方便新手阅读:
这里'\0'只占据了一个字节,原本的返回地址应该是0x40101C,'\0'只是覆盖了返回地址的最后一个字节,覆盖之后为0x401000,所以从头开始了

游客
登录 | 注册 方可回帖
返回