ICQ Baidu February Pwn



fast-fast-fast

题目是一个静态编译的64bit binary
看题目的名称猜测可能要用fastbin attack…
首先题目建立了smallbin与fastbin两个bins,分别都有create,delete,edit三种操作,其中漏洞出现在
delete函数,无论是smallbin还是fastbin共同使用该delete函数

首先delete没有判定是否已经delete,也没有在free将pointer置NULL,造成UAF(use after free)
基本思路利用UAF 做Fastbin Attack

  1. 通过构造一个fastbin与smallbin 指向用一块heap 内存,从而edit small修改已经被free掉的fastbin 的内容,再次cretea fastbin时触发fastbin attack
  2. 通过fastbinattack 将malloc的分配控制在.bss段的smallbin指针区域,通过该fastbin的修改能够控制smallbin的read与write
  3. 泄露environ确定stack的栈顶地址
  4. 利用smallbin,向ret返回地址处写入我们ret2syscall的Ropgadgets,Getshell

black_hole

IDA打开后很容易找到漏洞函数

简单的栈溢出,问题在于每次溢出只能够溢出16个字节,恰好覆盖完rip

思路首先是我们需要重复利用漏洞向栈上写入数据进行ROP,所以要return to vul,多次利用漏洞向栈中每次写入8个字节
每次通过布置栈内数据覆盖ebp 8个字节,然后控制eip返回vul function,相当于每次只能向栈内写入8个字节
由于栈是由高向低增长的,所以我们布置栈中的数据时,实际上是由高地址向低地址布置,所以需要反向写入

由于泄露地址相对复杂,采用修改got表期望指向syscall的方式,选择alarm函数,通过它泄露出syscall地址
通过read函数读入0x3b个字符,使得返回值eax=0x3b,使得syscall陷入时执行execve,并且将bin/sh与syscall写入bss段,最后调用执行

至于gadgets,用\(libc\_init\_csu\)中的通用ropgets即可,很适合三参数的函数的构造

werewolf

题目模拟了werewolf 狼人杀游戏,建立add,删除kill,编辑edit,打印show 角色role的过程
题目为每一个role建立了一个

的结构,所有的role储存在bss段上
同样共分成add,edit,show,kill四个操作,都是比较常规的操作,漏洞出现在kill函数中:

由于kill函数将action free掉之后,没有及时对指针置0,所以可能造成double free。
由于题目中开启了FULL RELRO,不能Hijack GOT,并且开启了PIE,我们无从泄露程序.text段地址,所以也不能用程序段的地址
我们的目标只能放在libc与heap中,所以思路主要是采用double-free unlink。
具体的步骤如下:

  1. 首先泄露出heap地址和libc地址,计算free_hook的地址。
  2. 利用double free-unlink,首先申请两个小的chunk,分别free掉,之后申请一个大的chunk,包含这个两个小的堆块,并通过add修改,构造fake chunk满足unsafe-unlink的条件,之后再free掉这个大的堆,触发unlink。
  3. 利用unlink我们将将free_hook==>system,之后free掉“/bin/sh”的chunk,触发system(“/bin/sh”)拿到shell

发表评论