[问题] 无法了解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