fastbin_attack中fake chunk 的size的限制

背景

復(fù)現(xiàn) 0ctf_2018 的 babyheap是碰見(jiàn)了十分奇怪的情況:
經(jīng)過(guò)一系列操作之后, 我需要fastbin attack 在main_arena中偽造一個(gè)fake chunk, 進(jìn)而修改top chunk的值, 從而達(dá)到任意地址寫(xiě)的目的.
經(jīng)過(guò)一系列操作, 我之一使得fast bin中0x50項(xiàng)中的指針指向0x7f707e3bfb45, 其指向空間如下:

0x7f707e3bfb45 <main_arena+37>: 0x00ca23e0d000007f  0x0000000000000055
0x7f707e3bfb55 <main_arena+53>: 0x0000000000000000  0x0000000000000000
0x7f707e3bfb65 <main_arena+69>: 0x0000000000000000  0x0000000000000000
0x7f707e3bfb75 <main_arena+85>: 0x00ca23e1a0000000  0x00ca23e130000056

照理說(shuō)我接下來(lái)調(diào)用一次alloc(0x40)就可以得到一個(gè)以0x7f707e3bfb45開(kāi)始的chunk了吧, 但是卻直接得到個(gè)錯(cuò)誤.

原因分析

經(jīng)過(guò)漫長(zhǎng)的debug之后我終于發(fā)現(xiàn)問(wèn)題出在fake chunk的size上了......0x55是不行滴.
經(jīng)過(guò)一系列的測(cè)試, 我發(fā)現(xiàn)當(dāng)fake chunk 的size為0x54, 0x55, 0x5c, 0x5d的時(shí)候, 調(diào)用alloc(0x40)都會(huì)報(bào)錯(cuò), 而其它的值則都沒(méi)有問(wèn)題.
那么這些值有什么共同點(diǎn)呢?

0x54 = 0101 0100b
0x55 = 0101 0101b
0x5c = 0101 1100b
0x5d = 0101 1101b

觀察它們的二進(jìn)制值發(fā)現(xiàn)它們的低數(shù)第3位都是1, 而根據(jù)定義: 這一位置1表示這個(gè)chunk不屬于main_arena. 而為什么這么就會(huì)報(bào)錯(cuò)的原因還是要看看libc源碼(省略了一些不必要的):

#define arena_for_chunk(ptr) \
  (chunk_main_arena (ptr) ? &main_arena : heap_for_ptr (ptr)->ar_ptr) //根據(jù)chunksize地書(shū)第三位判斷是否屬于main_arena
  
void *
__libc_malloc (size_t bytes)
{
  mstate ar_ptr;
  void *victim;
  arena_get (ar_ptr, bytes);
  victim = _int_malloc (ar_ptr, bytes);   //經(jīng)過(guò)debug可確定問(wèn)題出在_int_malloc之后
  
  assert (!victim || chunk_is_mmapped (mem2chunk (victim)) ||
          ar_ptr == arena_for_chunk (mem2chunk (victim)));  //如果低數(shù)第三位置一, 則arena_for_chunk返回的肯定不是&main_arena
  return victim;
}

因?yàn)榈蛿?shù)第三位置一, 所以arena_for_chunk返回的肯定不是&main_arena, 所以 ar_ptr == arena_for_chunk (mem2chunk (victim)))false, 由于三個(gè)判斷之間為或關(guān)系, 所以當(dāng)chunk_is_mmapped (mem2chunk (victim))返回true(即低數(shù)第二位置一)時(shí), 也不會(huì)報(bào)錯(cuò). 所以只有上面四個(gè)值會(huì)報(bào)錯(cuò).

更新: 利用fastbin attack時(shí)構(gòu)造fakechunk 的size時(shí)又遇到了一個(gè)坑, 也卡了挺長(zhǎng)時(shí)間的

背景:

這次是在線程中調(diào)用malloc(), 然后我在bss段有64字節(jié)的可讀寫(xiě)段(稱其為A, 設(shè)其地址為 0x6020000), 我也知道這段的地址. 而且我也已經(jīng)可以覆蓋線程的heap_info 和 malloc_state了, 我的目的就是在A中構(gòu)造一個(gè)fakechunk, 從而可以覆蓋A后面的一些關(guān)鍵數(shù)據(jù). 示意圖如下:

 bss: 0x602000(可寫(xiě))              heap info(可寫(xiě))
+----------^+-----------------+    +-----> +-----------------+
            |                 |            |                 |
            +-----------------+            |                 |
            |                 |    malloc state(可寫(xiě))        |
            +-----------------+    +-----> +-----------------+
            |                 |            |                 |
            +-----------------+            |                 |
            |                 |            |                 |
            +-----------------+            |                 |
            |                 |            |                 |
            |                 |            |                 |
            |                 |            |                 |
            |                 |            |                 |
            +-----------------+            |                 |
                                           +-----------------+

我的目的是malloc一個(gè)0x60大小的chunk. 所以我就將0x602000的8字節(jié)覆蓋為0x65:
這很合理, 將因?yàn)槭蔷€程分配的fast bin, 所以將A 和 P位設(shè)為1, 其余為設(shè)為0. 然后得到了SIGSEGV , 經(jīng)過(guò)debug發(fā)現(xiàn)_libc_malloc()中有一個(gè)檢測(cè):

//return_ptr 是調(diào)用 int_malloc返回的指向chunk內(nèi)容的指針
if ( return_ptr )
{
prev_size_ptr = *(_QWORD *)(return_ptr - 8);
if ( prev_size_ptr & 2 ) //檢測(cè)是否為 mmap的
  return return_ptr;
v6 = &dword_7F5FC1CEAB20;
if ( prev_size_ptr & 4 ) //檢測(cè)是否為子線程的
  v6 = *(int **)((return_ptr - 16) & 0xFFFFFFFFFC000000LL); //如果為子線程則計(jì)算該線程的heap info 的地址
if ( v6 == (int *)_RBX )  //檢測(cè)chunk的heap_info的地址是否合法(具體檢測(cè)原理不懂)
  return return_ptr;
((void (__fastcall *)(const char *, const char *, signed __int64, const char *))assert)(
  "!victim || chunk_is_mmapped (mem2chunk (victim)) || ar_ptr == arena_for_chunk (mem2chunk (victim))",
  "malloc.c",
  2927LL,
  "__libc_malloc");

程序會(huì)在第9行報(bào)SIGSEGV錯(cuò)誤, 因?yàn)橐驗(yàn)樵摰刂凡豢勺x.

通過(guò)觀察第5行可知如果把fakechunk的size的M位也設(shè)為1的話就可以通過(guò)檢測(cè)了.
于是乎將0x602000的8字節(jié)覆蓋為0x6f: 在設(shè)置一下對(duì)應(yīng)的fastbin, 成功得到fakechunk.

關(guān)于heapinfo可以參考這篇文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末焕妙,一起剝皮案震驚了整個(gè)濱河市宋渔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谚鄙,老刑警劉巖焦辅,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葛账,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡屡谐,警方通過(guò)查閱死者的電腦和手機(jī)述么,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)康嘉,“玉大人碉输,你說(shuō)我怎么就攤上這事⊥ふ洌” “怎么了敷钾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肄梨。 經(jīng)常有香客問(wèn)我阻荒,道長(zhǎng),這世上最難降的妖魔是什么众羡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任侨赡,我火速辦了婚禮,結(jié)果婚禮上粱侣,老公的妹妹穿的比我還像新娘羊壹。我一直安慰自己,他們只是感情好齐婴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布油猫。 她就那樣靜靜地躺著,像睡著了一般柠偶。 火紅的嫁衣襯著肌膚如雪情妖。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天诱担,我揣著相機(jī)與錄音毡证,去河邊找鬼。 笑死蔫仙,一個(gè)胖子當(dāng)著我的面吹牛料睛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼秦效,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼雏蛮!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起阱州,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挑秉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后苔货,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體犀概,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年夜惭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姻灶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诈茧,死狀恐怖产喉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敢会,我是刑警寧澤曾沈,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鸥昏,受9級(jí)特大地震影響塞俱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吏垮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一障涯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膳汪,春花似錦唯蝶、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至媳谁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間友酱,已是汗流浹背晴音。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缔杉,地道東北人锤躁。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像或详,于是被迫代替她去往敵國(guó)和親系羞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子郭计,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容