溢位漏洞利用小結(基礎)
shell 獲取小結
這裡總結幾種常見的獲取 shell 的方式:
-
執行 shellcode,這一方面也會有不同的情況
- 可以直接返回 shell
- 可以將 shell 返回到某一個埠
- shellcode 中字元有時候需要滿足不同的需求
- 注意,我們需要將 shellcode 寫在可以執行的記憶體區域中。
-
執行 system("/bin/sh"),system('sh') 等等
- 關於 system 的地址,參見下面章節的地址尋找。
- 關於 "/bin/sh", “sh”
- 首先尋找 binary 裡面有沒有對應的字串,比如說有 flush 函式,那就一定有 sh 了(例如:ROPgadget.py --binary ./vuln --string "/bin/sh")
- 考慮個人讀取對應字串
- libc 中其實是有 /bin/sh 的 (需要程式執行的時候獲取)
- 首先尋找 binary 裡面有沒有對應的字串,比如說有 flush 函式,那就一定有 sh 了(例如:ROPgadget.py --binary ./vuln --string "/bin/sh")
- 優點
- 只需要一個引數。
- 缺點
- 有可能因為破壞環境變數而無法執行。
-
執行 execve("/bin/sh",NULL,NULL)
- 前幾條同 system
- 優點
- 幾乎不受環境變數的影響。
- 缺點
- 需要 3 個引數。
-
系統呼叫(例如 int 80 )
- 系統呼叫號
__NR_execve
在 IA-32 中為 11(0xb),x86-64 為 59(0x3b)
- 系統呼叫號
地址尋找小結
在漏洞利用過程中,我們總是免不了要去尋找一些地址,常見的尋找地址的型別有如下幾種
通用尋找 ¶
直接地址尋找 ¶
程式中已經給出了相關變數或者函式的地址了。這時候,我們就可以直接進行利用了。
got 表尋找 ¶
有時候我們並不一定非得直接知道某個函式的地址,可以利用 GOT 表跳轉到對應函式的地址。當然,如果我們非得知道這個函式的地址,我們可以利用 write,puts 等輸出函式將 GOT 表中地址處對應的內容輸出出來(前提是這個函式已經被解析一次了
有 libc查詢¶
相對偏移尋找,這時候我們就需要考慮利用 libc 中函式的基地址一樣這個特性來尋找了。比如我們可以通過 __libc_start_main 的地址來洩漏 libc 在記憶體中的基地址。
libc_base = __libc_start_main - offset (__libc_start_main)
system_real_addr = libc_base + offset (system)
bin_sh_real_addr = libc_base + offset( '/bin/sh')
注意:不要選擇有 wapper 的函式,這樣會使得函式的基地址計算不正確。常見的有 wapper 的函式有?(待補充)。
無 libc查詢¶
其實,這種情況的解決策略分為兩種
- 想辦法獲取 libc
- 想辦法直接獲取對應的地址。
而對於想要洩露的地址,我們只是單純地需要其對應的內容,所以 puts , write,printf 均可以。
- puts,printf 會有 \x00 截斷的問題
- write 可以指定長度輸出的內容。
下面是一些相應的方法
pwnlib.dynelf
¶
前提是我們可以洩露任意地址的內容。
- 如果要使用 write 函式洩露的話,一次最好多輸出一些地址的內容,因為我們一般是隻是不斷地向高地址讀內容,很有可能導致高地址的環境變數被覆蓋,就會導致 shell 不能啟動。
libc 資料庫 ¶
## 更新資料庫
./get
## 將已有libc新增到資料庫中
./add libc.so
## Find all the libc's in the database that have the given names at the given addresses.
./find function1 addr function2 addr
## Dump some useful offsets, given a libc ID. You can also provide your own names to dump.
./dump __libc_start_main_ret system dup2
去 libc 的資料庫中找到對應的和已經出現的地址一樣的 libc,這時候很有可能是一樣的。
也可以使用如下的線上網站:
當然,還有上面提到的 https://github.com/lieanu/LibcSearcher。
ret2dl-resolve¶
當 ELF 檔案採用動態連結時,got 表會採用延遲繫結技術。當第一次呼叫某個 libc 函式時,程式會呼叫_dl_runtime_resolve 函式對其地址解析。因此,我們可以利用棧溢位構造 ROP 鏈,偽造對其他函式(如:system)的解析。這也是我們在高階 rop 中會介紹的技巧。
題目 ¶
- train.cs.nctu.edu.tw: rop
- 2013-PlaidCTF-ropasaurusrex
- Defcon 2015 Qualifier: R0pbaby
以上內容參考 CTF wiki