欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创] CTF2017 秋 第二题解答

[原创] 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。

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

0 0 0 举报
复制成功