[問題] 無法了解shell code執行程式

看板C_and_CPP作者 (ner)時間7年前 (2016/07/10 21:15), 編輯推噓15(15030)
留言45則, 15人參與, 最新討論串1/2 (看更多)
今天在看一個簡單的小程式 程式目的是執行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

07/10 21:20, , 1F
可以這樣轉型喔!?求解釋
07/10 21:20, 1F

07/10 21:27, , 2F
把 array of char 轉型成 function pointer
07/10 21:27, 2F

07/10 21:29, , 3F
Code 程式碼(機械碼),函數指標
07/10 21:29, 3F

07/10 21:30, , 4F
呼叫code的程式
07/10 21:30, 4F

07/10 21:31, , 5F
駭客
07/10 21:31, 5F

07/10 21:33, , 6F
請問func到底指向什麼鬼?? 還是是s2大說的轉型呢?
07/10 21:33, 6F

07/10 21:42, , 7F
程式經過編譯器編譯後,會產生一連串的機器碼資料
07/10 21:42, 7F

07/10 21:43, , 8F
當程式執行時指令機器碼會被 Program Loader 加載到
07/10 21:43, 8F

07/10 21:44, , 9F
記憶體,進而讓內部或外部的程式執行該片段指令
07/10 21:44, 9F

07/10 21:44, , 10F
那段程式碼在有開 DEP 的機器上,通常執行都會失敗
07/10 21:44, 10F

07/10 21:45, , 11F
通常我們會用 VirtualAlloc 或 mmap 等 API 來配置一段
07/10 21:45, 11F

07/10 21:45, , 12F
可讀可寫可執行的區塊,把指令機器碼搬過去該區塊
07/10 21:45, 12F

07/10 21:47, , 13F
這也是 JIT 重要的環節之一,動態產生可執行的機器碼
07/10 21:47, 13F

07/10 21:47, , 14F
至於那個就是轉型,做出 function call 所需要的動作
07/10 21:47, 14F

07/10 21:48, , 15F
如把參數 push 到 stack (視 calling convention 而定)
07/10 21:48, 15F

07/10 21:49, , 16F
進而執行該機器碼指令 (已盡量用淺顯文字描述 XD)
07/10 21:49, 16F

07/10 21:50, , 17F
有興趣可以去選修 compiler 的相關課程
07/10 21:50, 17F

07/10 21:51, , 18F
轉型成 function pointer (callable)
07/10 21:51, 18F

07/10 22:01, , 19F
func 實際上就是直接指到那塊陣列,可以再進行呼叫動作
07/10 22:01, 19F

07/10 22:02, , 20F
會組語的秒懂
07/10 22:02, 20F

07/10 22:03, , 21F
有興趣的人可以玩玩 Compiler Explorer - C++
07/10 22:03, 21F

07/10 22:03, , 22F
https://goo.gl/9yX6KQ 然後把顯示 Binary 打開
07/10 22:03, 22F

07/10 22:03, , 23F
對於剛入門編譯器設計,或者不懂組語的多少有些幫助
07/10 22:03, 23F

07/10 22:18, , 24F
感謝Lilo大大的開釋 謝謝!!
07/10 22:18, 24F

07/11 00:22, , 25F
原 PO 看得懂 int (*func)(); 已經很猛了
07/11 00:22, 25F

07/11 06:59, , 26F
如果想自己測試的話,gcc加-zexecstack,這是關DEP
07/11 06:59, 26F

07/11 07:00, , 27F
搭配gdb下lay asm,可以si去跟看看
07/11 07:00, 27F

07/11 08:57, , 28F
弱弱的說一句其實我懂組語 但自學的沒有很扎實...
07/11 08:57, 28F

07/11 10:41, , 29F
(int)(*func)(); 這行是呼叫執行嗎?
07/11 10:41, 29F

07/11 12:58, , 30F
這行其實是宣告...XD
07/11 12:58, 30F

07/11 13:00, , 31F
阿 看錯行 這行是執行
07/11 13:00, 31F

07/11 16:25, , 32F
第一行宣告, 第二行轉型, 第三行執行
07/11 16:25, 32F

07/11 16:27, , 33F
基本上第二行寫成那樣是為了符合 C 語言的規則
07/11 16:27, 33F

07/11 16:27, , 34F
你必須要取得一個函式指標才能進行間接呼叫
07/11 16:27, 34F

07/11 16:28, , 35F
第二行那個轉型就是把字串指標硬轉成函式指標
07/11 16:28, 35F

07/11 16:57, , 36F
執行應該 (*func)(); 就可以了吧?
07/11 16:57, 36F

07/11 17:02, , 37F
(int) 應該是把回傳值轉型, 可是執行完 shellcode
07/11 17:02, 37F

07/11 17:03, , 38F
程式就跳掉了, 應該也用不到回傳值
07/11 17:03, 38F

07/12 01:41, , 39F
這邊的懂組語是指compiler 的課嗎 還是architecture
07/12 01:41, 39F

07/12 21:47, , 40F
原Po是在看ais3 2015的writeup嗎XDD
07/12 21:47, 40F

07/13 00:54, , 41F
執行不是直接 func(); ?
07/13 00:54, 41F

07/13 00:57, , 42F
測過兩種都能跑,直接寫 func(); 比較容易懂
07/13 00:57, 42F

07/13 12:23, , 43F
阿靠 忘了要做AIS
07/13 12:23, 43F

07/13 16:40, , 44F
樓上還有時間
07/13 16:40, 44F

07/14 08:11, , 45F
要玩這東西請找舊一點的os + 舊shell
07/14 08:11, 45F
文章代碼(AID): #1NWafSrX (C_and_CPP)
文章代碼(AID): #1NWafSrX (C_and_CPP)