先拿到题目 ret2text
拿到题目,先检查file文件类型,然后丢入ida进行分析
找到主函数,发现并没有什么漏洞,但有个vulnerable()函数
查看vulnerable()函数,发现漏洞,竟然发现存在gets()函数,那必然可以进行栈溢出
并且发现有个后面函数,get_shell(),则目标明确,就是通过栈溢出调用get_shell()获取权限即可
则目标是构造溢出payload,为了确定溢出填充字符,进行gdb调试:gdb:ret2text
开始调试,在main函数那打断点
gdb 小知识:
(breakpoints) b 函数名/函数入口地址: 打断点
(next) n:下一步
(run) r:运行
(step in) s:进入一个函数,不然会直接运行函数返回结果
stack num:显示附近num项的地址情况
调试进入vulnerable()函数,并运行gets函数,输入正常值,再输入stack 24 查看栈情况的情况
第一根红线表示栈顶,第二根红线表示底端,黄线位置代表的值则表示要返回的上一个函数调用点的位置,我们的目标就是改变黄色地址空间的值,使得其转向get_shell()函数,这边要解决两个问题
- 怎么构造payload,要覆盖多少字节数据
- 找到get_shell()入口
针对第一个问题:如上图我们正常输入ssds时,数据被存入0xffffd118地址,我们先覆盖到ebp指向的地址,中间一共16字节,然后ebp地址也要覆盖,这需要4个字节,最后是get_shell地址
打开ida,找到get_shell函数,发现入口地址为:0x8048522
payload构造完毕,开始写程序进行攻击
from pwn import *
io = process("./ret2text")
payload = b'A'*16 + b'B'*4 + p64(0x8048522)
io.send(payload)
io.interactive()
成功!!!