CTF--2016湖湘杯全国网络安全技能大赛之栈溢出pwnme

0x01 基础知识


本题目考察逆向分析,漏洞挖掘以及利用能力。

学习本篇技术,提前储备好栈溢出相关知识。

几个重要工具pwntools,GDB,IDA,objdump


http://www.cse.scu.edu/~tschwarz/coen152_05/Lectures/BufferOverflow.html

http://bitvijays.github.io/LFCBinaryExploitation.html

https://github.com/Gallopsled/pwntools

http://docs.pwntools.com/en/stable/about.html


题目


0x02 基本分析


拿到题目先对其进行基本分析,使用工具checksec.sh脚本检测。




根据这个判断程序运行在32位系统之上。没有开启canary和nx保护。

猜测题目考察内容多为溢出漏洞。运行程序




题目好像是关于水果的一个小游戏。

分别测试输入1,2发现并没有别的异常现象,只是普通的输入输出。


0x03 静态分析


于是乎采用大神器ida进行分析。



F5快捷键



分支进行判断,发现选项1,2,3,4,6,其它都是无意义输入。

只有5会进入一个getfruit函数。



同时还注意到左侧出现了getflag函数,敏感函数。



仔细看发现这个函数可以获取flag,但是这个函数没有地方调用。

main主函数没有调用的地方。但是发现scanf函数有溢出漏洞。

于是乎,打算利用此函数漏洞,看能不能实现溢出覆盖返回地址,

强制其跳转到getflag函数地址。覆盖返回EIP为getflag函数地址。

即可获得flag,溢出多少地址可以覆盖栈中的返回地址。


0x04 动态分析



objdump -d pwnme > pwnme.asm

先用这个命令查找函数地址





0x08048624 getfruit()

0x08048659 scanf()

0x08048677 getflag()

上linux调试神器GDB



下断点

0x08048624 getfruit()

0x08048659 scanf()


r命令运行起来

然后输入选择5



stepi    单步步入

next     单步步过

提前准备好字符串

pattern_create 100



然后运行到输入scanf函数位置

手动输入粘贴以上字符串。

再看看栈地址数据




基地址ebp



字符串起始地址和栈基地址



再查看上次栈基地址ebp



函数返回地址。0x080487ea==>0x08048677

184-020=164

164+4=168

溢出位置是168字节。然后覆盖函数地址。



0x05 利用程序


在这里基本就差不多清楚了。剩下的就是手动编写exploit程序了。

根据这个思路写出exploit如下。




测试结果





你可能感兴趣的:(二进制,逆向工程,漏洞学习,安全札记,反汇编,网络安全与恶意代码)