题目描述:菜鸡认为自己需要一个字符串
0x01
checksec
IDA
运行效果
0x02
我们看见main函数的伪代码中执行了hello函数,进一步观察hello函数
gets
gets() 有一个非常大的缺陷,即它不检查预留存储区是否能够容纳实际输入的数据,换句话说,如果输入的字符数目大于数组的长度,gets()无法检测到这个问题,就会发生内存越界
1、程序中使用了gets(&s),可能存在栈溢出
2、fgets函数把数据写入name中,而name是一个全局变量地址是固定的
3、并且我们找到了一个system函数
我们可以通过栈溢出,传入/bin/sh给system函数执行,就可以getshell了
现在我们要查看hello的函数栈空间布局计算偏移量
gets(&s);,s的栈情况,我们要覆盖返回地址(0x26+4)就可以覆盖到返回地址了
system函数地址
name地址
最终:将返回地址覆盖为system函数地址,再利用name传入的/bin/sh字符串,传给system函数程序就会返回一个shell给我们
0x03
构造exp
偏移量是转为十进制38+4=42,还需要填充四个字节的数据给system函数当做返回地址,才能使程序正常运行,数据随意
1 | from pwn import * |