0x00 前言
依然是Unlink,写本文来警示自己exp一定要写的规范,因为我写的不规范,导致后期调试的时候一直多出来一个\n,找了半天才发现是因为格式不规范..
题目下载链接:下载链接
参考链接:
0x01 分析
1 | Arch: amd64-64-little |
- 与上文的note2一样,程序提供了5个选项。
New note
,创建note,每个note的size和chunk都会存在bss段的对应位置。Show note
,这次程序虽然提供了提供show,但却是输出"No show, No leak."
。Edit note
,相比note2,这次程序只提供了overwrite方法。Delete note
,能执行正常的free,并置0。Exit
,退出程序。
漏洞点1
- 同note2一样,都会由于unsigned int 这个类型造成可写入大量数据。
漏洞点2
- 由于程序
edit
、delete
函数里面对note ID
的检验并不严谨,导致即使note ID
是负数也能通过检验。
0x02 Do it!
- 漏洞点1可以仅用Unlink来利用。
- 但是漏洞2需要配合UAF。
- 本文是针对Unlink来写的,所以利用了漏洞点1,构造方法和原理与note2一样,具体可以看前文,相比之下note3因为没有直接的leak,我们需要想办法进行leak。
前期模板
1 | # -*- coding:utf-8 -*- |
- 因为我在第一次写的时候,
delete
里c.recvuntil('Input the id of the note:\n')
后面都没有加上\n
,这样导致后面leak的时候总会把\n
也读入进去,从而leak出来的结果不正确。为了严谨,对每个recvuntil
都加上了\n
。 - 注意代码中
注意这里
,这个设置了一个timeout
,因为也不知道为什么,后期有一处edit的时候总是接收不到Edit success!\n
。
伪造chunk并unlink
1 | target = 0x6020c0 + 0x8 #0x6020c0存的是当前chunk的指针,0x6020c8才是chunk指针数组的起始位置。 |
leak
1 | puts_got = elf.got["puts"] |
getshell
1 | new(0x20,'/bin/sh\00')#由于delete函数完成后会置0,所以这时候我们new一个新chunk的话,它会是chunk1 |
0x03完整exp
1 | from pwn import * |