看板 C_and_CPP 關於我們 聯絡資訊
今天在看一個簡單的小程式 程式目的是執行shell code 但看不太懂 google關鍵字也下的不太好 沒有找到相關資訊 主要程式碼如下: char code[] = "\x..\x.." int main () { int (*func)(); func = (int(*)()) code; (int)(*func)(); } shell code的部份我就不打了 主要是看不懂第二行到底再寫什麼 或可以告訴我要往哪個方向找 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.229.182.169 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1468156508.A.D61.html
chuegou: 可以這樣轉型喔!?求解釋 07/10 21:20
s25g5d4: 把 array of char 轉型成 function pointer 07/10 21:27
johnpage: Code 程式碼(機械碼),函數指標 07/10 21:29
johnpage: 呼叫code的程式 07/10 21:30
johnpage: 駭客 07/10 21:31
zarados: 請問func到底指向什麼鬼?? 還是是s2大說的轉型呢? 07/10 21:33
LiloHuang: 程式經過編譯器編譯後,會產生一連串的機器碼資料 07/10 21:42
LiloHuang: 當程式執行時指令機器碼會被 Program Loader 加載到 07/10 21:43
LiloHuang: 記憶體,進而讓內部或外部的程式執行該片段指令 07/10 21:44
LiloHuang: 那段程式碼在有開 DEP 的機器上,通常執行都會失敗 07/10 21:44
LiloHuang: 通常我們會用 VirtualAlloc 或 mmap 等 API 來配置一段 07/10 21:45
LiloHuang: 可讀可寫可執行的區塊,把指令機器碼搬過去該區塊 07/10 21:45
LiloHuang: 這也是 JIT 重要的環節之一,動態產生可執行的機器碼 07/10 21:47
LiloHuang: 至於那個就是轉型,做出 function call 所需要的動作 07/10 21:47
LiloHuang: 如把參數 push 到 stack (視 calling convention 而定) 07/10 21:48
LiloHuang: 進而執行該機器碼指令 (已盡量用淺顯文字描述 XD) 07/10 21:49
LiloHuang: 有興趣可以去選修 compiler 的相關課程 07/10 21:50
LiloHuang: 轉型成 function pointer (callable) 07/10 21:51
LiloHuang: func 實際上就是直接指到那塊陣列,可以再進行呼叫動作 07/10 22:01
ctrlbreak: 會組語的秒懂 07/10 22:02
LiloHuang: 有興趣的人可以玩玩 Compiler Explorer - C++ 07/10 22:03
LiloHuang: https://goo.gl/9yX6KQ 然後把顯示 Binary 打開 07/10 22:03
LiloHuang: 對於剛入門編譯器設計,或者不懂組語的多少有些幫助 07/10 22:03
zarados: 感謝Lilo大大的開釋 謝謝!! 07/10 22:18
s25g5d4: 原 PO 看得懂 int (*func)(); 已經很猛了 07/11 00:22
seanwu: 如果想自己測試的話,gcc加-zexecstack,這是關DEP 07/11 06:59
seanwu: 搭配gdb下lay asm,可以si去跟看看 07/11 07:00
zarados: 弱弱的說一句其實我懂組語 但自學的沒有很扎實... 07/11 08:57
Qoofate: (int)(*func)(); 這行是呼叫執行嗎? 07/11 10:41
s25g5d4: 這行其實是宣告...XD 07/11 12:58
s25g5d4: 阿 看錯行 這行是執行 07/11 13:00
LPH66: 第一行宣告, 第二行轉型, 第三行執行 07/11 16:25
LPH66: 基本上第二行寫成那樣是為了符合 C 語言的規則 07/11 16:27
LPH66: 你必須要取得一個函式指標才能進行間接呼叫 07/11 16:27
LPH66: 第二行那個轉型就是把字串指標硬轉成函式指標 07/11 16:28
freef1y3: 執行應該 (*func)(); 就可以了吧? 07/11 16:57
freef1y3: (int) 應該是把回傳值轉型, 可是執行完 shellcode 07/11 17:02
freef1y3: 程式就跳掉了, 應該也用不到回傳值 07/11 17:03
steve1012: 這邊的懂組語是指compiler 的課嗎 還是architecture 07/12 01:41
b0920075: 原Po是在看ais3 2015的writeup嗎XDD 07/12 21:47
Bencrie: 執行不是直接 func(); ? 07/13 00:54
Bencrie: 測過兩種都能跑,直接寫 func(); 比較容易懂 07/13 00:57
TobyH4cker: 阿靠 忘了要做AIS 07/13 12:23
b0920075: 樓上還有時間 07/13 16:40
cobrasgo: 要玩這東西請找舊一點的os + 舊shell 07/14 08:11