start
這一題被迫要用 Ruby 來寫…
還好之前有摸過一點
會拿到兩個檔案
一個是 server.rb
另一個是 start
start 只有開在 localhost
server.rb 會架在 port 31337
傳 ruby 指令過去
他會幫你執行
因為 start 是 static link
可以找到 syscall 的 ROPgadget
canary 的部分只要把 buf 和 canary 之間塞滿
就能在 puts(buf) 的時候順便把 canary print 出來
有 canary 之後就可以直接用 rop 執行 /bin/sh
然後 cat flag
exploit
artifact
會看到保護幾乎都開啟了…
可是直接讓我們可以讀寫任一記憶體位址
所以可以利用 rop 呼叫 /bin/sh
但是當 rop 寫好開始執行後會發現
會有一個 SIGSYS 的錯誤
因為在程式一開頭呼叫了 prctl 函數
限制只有某些 syscall 可以執行
第 12 行的地方
根據 prctl.h 得知 38 代表 PR_SET_NO_NEW_PRIVS
因為第二個參數是 2 所以 no_new_privs bit = 1
第 13 行的地方
22 代表 PR_SET_SECCOMP
第二個參數是 2 所以是使用 SECCOMP_MODE_FILTER
由第三個參數設定過濾方式
第三個參數指向 sock_fprog 這個結構
這個結構又會指向 bpf 這段過濾用的程式碼
利用 bpfdbg 反組譯 bpf 指令
ld [x] 會讀取下面這個結構的值
所以只要讓 syscall == 第三個參數的值就能使用了
exploit