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

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

Links booklink

Contact Us: admin [ a t ] ucptt.com