monkey
- 本題是一個(gè) c 語(yǔ)言框架的 js執(zhí)行
- 查看wp的得到提示
- 這個(gè) 框架內(nèi)置函數(shù)有 os.system(); 所以直接執(zhí)行shell即可
- 注意點(diǎn):
- 看到不熟悉的復(fù)雜代碼凝颇,要查看是否有官方文檔
pwn1
- x64 elf | full Relro , stack canary , nx
- 功能分析:
- store | 輸入函數(shù) ,有棧溢出 儡率,只可以覆蓋到ret地址 妖枚,且無(wú)結(jié)尾符,可配合leak
- get | 輸出函數(shù) 批狐,可以輸出棧上字符串
- 利用流程:
- leak canary | 繞過(guò) stack canary
- 覆蓋到ebp 瓮下, leak main函數(shù)的返回地址 , 得到 __libc_start_main + 240 的地址
- 覆蓋ret | 因?yàn)橹荒芨采wret地址记劈,所以需要使用 one gadget (用 __libc_start_main 計(jì)算相對(duì)偏移得出)
babyfengshui
- x86 elf | stack canary , nx
- 功能分析:
- 菜單
- add
- 分配兩個(gè)chunk , 指定大小的 desc chunk和 存儲(chǔ)desc地址及name字符串的 user chunk
- 讀入 name | 0xfc
- 使用 edit 讀入desc
- delete
- free *heaparray[desc] | desc
- free heaparray[desc] | user
- heaparray[desc] = null
- show
- 輸出指定 index 的 name 和 desc
- edit
- 輸入長(zhǎng)度 size | 判斷 desc + size < name
- 即 desc 輸入可到達(dá)的地址要在對(duì)應(yīng)的 user chunk 之前 | 目的 防止堆溢出
- 進(jìn)行size長(zhǎng)度的輸入
- 輸入長(zhǎng)度 size | 判斷 desc + size < name
- 利用過(guò)程:
-
通過(guò)控制堆塊布局赫冬,使我們可以溢出來(lái)控制其他堆塊的內(nèi)容
- 覆蓋 desc地址為 free@got 從而leak libc
- 覆蓋 free 為 system , 執(zhí)行delete getshell.
-
stack2
- x86 elf | stack canary , nx
- 功能分析
- 計(jì)算器
- 數(shù)字的增刪改查
- 漏洞點(diǎn)
- 最開(kāi)始初始化時(shí) 未將 總數(shù)字量限定在 100內(nèi) 浓镜, 配合 scanf 的 “+”輸入 , 可以leak棧地址
- 修改 數(shù)字時(shí) 輸入的index未檢查劲厌,可以越界 膛薛,造成棧溢出 - 利用過(guò)程
- 坑點(diǎn) : hackhere 函數(shù)遠(yuǎn)程不成功 , 無(wú)/bin/bash
- 思路1 : 利用 棧溢出配合scanf ,向可寫地址(如 bss 段)輸入 /bin/sh\x00 或者 $0\x00 补鼻, 然后執(zhí)行system("/bin/sh\x00")
- 思路2 : 初始化時(shí)設(shè)置較大的總數(shù)字量 , leak棧地址 哄啄, 然后通過(guò)編輯函數(shù)在棧上輸入 shell命令 ,然后通過(guò)棧溢出 執(zhí)行system(command)
time_formatter
- x64 elf | stack canary , nx , fortify
- 功能分析 :
- 菜單(設(shè)置參數(shù)后命令執(zhí)行)
- 設(shè)置參數(shù) 格式化字符串
- 設(shè)置參數(shù) 指定時(shí)間戳
- 設(shè)置參數(shù) 時(shí)區(qū)
- 未對(duì)已有 時(shí)區(qū)參數(shù)的情況做處理 - 輸出 命令執(zhí)行結(jié)果
- 退出 (可選擇是否 退出)
- 漏洞點(diǎn) uaf
- 利用過(guò)程:
- 利用uaf 和 未對(duì)已有時(shí)區(qū)做處理的機(jī)制 ,在無(wú)限制的設(shè)置時(shí)區(qū)中來(lái)設(shè)置格式化字符串
- 設(shè)置 格式化字符串 (malloc(n))
- 設(shè)置時(shí)區(qū) (malloc(n))
- 退出 (選擇否 风范, 目的是 free上面的兩個(gè)塊)
- 設(shè)置時(shí)區(qū)(消耗時(shí)區(qū) free的塊)
- 設(shè)置時(shí)區(qū) (使用格式化字符串free的塊)
- tip:
- strdup 內(nèi)部使用了 malloc
- 各個(gè)階段設(shè)置的字符串最好長(zhǎng)度一樣且能滿足getshell的需求
- 利用uaf 和 未對(duì)已有時(shí)區(qū)做處理的機(jī)制 ,在無(wú)限制的設(shè)置時(shí)區(qū)中來(lái)設(shè)置格式化字符串
forgot
- x86 elf | nx
- 功能 :
- 1. 輸入姓名
- 2. 輸入一個(gè)字符串 (可溢出 , 因?yàn)橛胹canf輸入咨跌,只可構(gòu)造一個(gè)地址)
- 3. 進(jìn)行 n 層檢測(cè) ,不通過(guò)即調(diào)用 第 n 個(gè) 輸出函數(shù) (輸出函數(shù)地址存儲(chǔ)在棧上) - 漏洞利用 :
- 棧溢出覆蓋一個(gè) 檢測(cè)函數(shù)地址為后門地址
- 觸發(fā)指定的函數(shù) 硼婿, 從而獲得flag
4-ReeHY-main-100
- x64 elf | nx
- 功能:
- 菜單
- 對(duì)于 exp 的 增刪改 锌半, 沒(méi)有直接給出有實(shí)際意義的show
- 漏洞點(diǎn):
- 增刪改過(guò)程中 , index 使用的時(shí) Int類型 , 可使用負(fù)數(shù)index加酵,來(lái)對(duì)size數(shù)組做操作拳喻,從而拓展成堆溢出,并進(jìn)行深層次利用猪腕。
- 利用過(guò)程
- 覆蓋size數(shù)組,來(lái)為堆溢出做準(zhǔn)備
- add 5 個(gè) exp , 最后一個(gè)內(nèi)容為 /bin/sh\x00 ( 作為 system的參數(shù))
- 配合堆溢出 使用unlink 來(lái)控制 exp數(shù)組內(nèi)容
- 將 free@got 的值 覆蓋為 puts@plt+6 , 從而可以泄露
- unlink_addr - 0x10 ( n => free@got => puts@got
- unlink_addr - 0x10 ( n => unilnk_addr -0x18 => free@got ))
- 泄露 puts 地址 钦勘, 并且根據(jù)此計(jì)算出 system地址
- 覆蓋 free@got 為 system
- free(4) (system("/bin/sh\x00")) getshelll
- 防御
- 將 index 的類型設(shè)置為 unsigned int - 收獲
- 了解到了一種新的思路 ( 覆蓋 got表 為 plt + 6)
- 作用 : 執(zhí)行對(duì)應(yīng)函數(shù)陋葡,目前最大的理解為多出leak的手段
Escape_From_Jail-50
- 本題為 python 沙箱逃逸
,- 關(guān)鍵過(guò)濾 : '.' , import , flag 和 "eval" , "excute" 等命令執(zhí)行 , 看題目源碼中還過(guò)濾了 chr 等字符轉(zhuǎn)換方法 - 利用到的知識(shí)點(diǎn):
- getattr 可以獲得 目標(biāo)對(duì)象的指定方法對(duì)象 彻采, 從而繞過(guò) ’.‘號(hào)的過(guò)濾
- 舉例 : os.system("ls") (error) | getattr(os , "system")("ls") (success)
- 通過(guò)通配符 繞過(guò)對(duì)flag字符串的過(guò)濾 | 此處 多種方法
- getattr 可以獲得 目標(biāo)對(duì)象的指定方法對(duì)象 彻采, 從而繞過(guò) ’.‘號(hào)的過(guò)濾
- 獲取flag payload : getattr(os , "system")("cat /home/ctf/????")
pwn2
- 有點(diǎn)瓜皮了腐缤,一開(kāi)始莫名其妙鉆進(jìn)了死胡同,以為是 house of orange , 就折騰了幾個(gè)小時(shí)肛响。岭粤。。
- 話說(shuō) 有大佬用 house of orange 的思路做出來(lái)的話 特笋, 想學(xué)習(xí)一波剃浇。。。虎囚。
- 這道題目主要的利用點(diǎn)
- edit 函數(shù)的堆溢出
- Print 函數(shù)根據(jù) size數(shù)組中對(duì)應(yīng)的值 輸出對(duì)應(yīng)長(zhǎng)度的字符串
- New 時(shí)讀入 時(shí)讀入size長(zhǎng)度的內(nèi)容角塑,不以任何字符為截?cái)喾?(可以雖輸入不可見(jiàn)字符,或者 \x00 \n , 但是要注意被覆蓋的內(nèi)容的作用)
- 利用過(guò)程
- 利用堆溢出 實(shí)現(xiàn) chunk over extend , 從而可以 print 出 下一個(gè) chunk的內(nèi)容
- 通過(guò)1 的點(diǎn) 配合一個(gè) unsorted bin , 實(shí)現(xiàn) unsorted bin leak , 從而得到 libc 信息
- 通過(guò) 1 的點(diǎn), 修改 freed的 fastbin , 實(shí)現(xiàn) fastbin attack , 從而覆蓋 malloc_hook 為 one_gadget , (不覆蓋 got 表 淘讥, 因?yàn)?Full Relro , 并且開(kāi)啟了 pie , 沒(méi)有獲取到 codebase)
- 調(diào)用 new 觸發(fā) one_gadget 從而 getshell
AUL
- 這道題目是一個(gè) lua 的pwn 圃伶, 考察 對(duì)lua的熟悉程度和理解。蒲列。窒朋。
- 連上遠(yuǎn)程之后 , help 輸出 一段字節(jié)碼 蝗岖,是 server.luac 的 字節(jié)碼 | 缺少頭部一個(gè)字節(jié)
- tip :
- luac 文件頭 1b 4c 75 61
- luac 對(duì)于文件字節(jié)要求嚴(yán)格, 一個(gè)字節(jié)都不能少侥猩。。剪侮。
- tip :
- 漏洞點(diǎn):
- 雖然禁止了一部分關(guān)鍵詞,但是仍然可以調(diào)用內(nèi)部模塊,函數(shù) 拭宁, 官方wp 的方法不夠徹底,adworld 的 wp 中使用 os.execute 可以執(zhí)行系統(tǒng)命令(包括 /bin/sh)