您的位置:首页 > 理论基础 > 计算机网络

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

2017-03-30 18:41 1151 查看

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如下。



测试结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: