[原创] CTF2017 秋 第二题解答
1、初步分析陷入迷茫
初步分析程序用全局变量dword_41B034保存了一个控制变量,控制变量初始值为2,当该值变为0时会输出“You get it!”

而程序在获取输入之后调用了2个函数,这两个函数在满足一堆条件下分别会对dword_41B034做减1操作,看似2次减一之后dword_41b034就能变成0
再看条件,两个函数的v0都用的输入的前4字节,v1都用的输入的5到8字节。


我们选出其中的2个方程

求差发现 12*(v1-v0)== 奇数,而输入无论如何都是整数,所以等式左边一直都是偶数,等式永远不会成立。理论上证明这一组方程无整数解,不用去穷举了。
2、发现玄机
发现函数在获取输入时存在栈溢出,输入16个字符程序出现崩溃,返回地址被输入的第13~16个字节覆盖,考虑直接ret到0x40102f位置,但优于规则限制输入字符只能是数字和字母,该方案行不通;而用shellcode的话很难构造出只含有数字和字母的shellcode。考虑到验证码唯一性、字符限制等综合条件,出题人的意图可能是在栈溢出后ret到预先设置好的代码,ret的地址是可以通过输入数字和字母字符构造出来的,用IDA浏览一下程序代码,不难发现一个看似符合条件的可疑块00413131,0x41对应字符A,0x31对应字符1,而0x00刚好是字符串结尾。由此猜测输入共15个字符,最后3个字符是"11A"

3、抽丝剥茧,柳岸花明
用输入11223344556611A作为输入测试,发现程序并没有崩溃,可见思路是正确的。
将输入字符标记为污点,使用污点传播提取出相关的指令如下图,我们假定输入的前4字符组成的int为a,5~8字节组成的int为b,9~12字节组成的int为c,标记出相关指令对应的表达式,推断表达式需满足的条件,构造满足条件的一个输入,让程序往下执行,再得到下一个条件,以此类推。

注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
