1. 程式人生 > >溢位漏洞利用小結(基礎)

溢位漏洞利用小結(基礎)

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 的 (需要程式執行的時候獲取)
    • 優點
      • 只需要一個引數。
    • 缺點
      • 有可能因為破壞環境變數而無法執行。
  • 執行 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