作者zarados (ner)
看板C_and_CPP
标题[问题] 无法了解shell code执行程式
时间Sun Jul 10 21:15:06 2016
今天在看一个简单的小程式 程式目的是执行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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1468156508.A.D61.html
1F:推 chuegou: 可以这样转型喔!?求解释 07/10 21:20
2F:推 s25g5d4: 把 array of char 转型成 function pointer 07/10 21:27
3F:推 johnpage: Code 程式码(机械码),函数指标 07/10 21:29
4F:→ johnpage: 呼叫code的程式 07/10 21:30
5F:→ johnpage: 骇客 07/10 21:31
6F:→ zarados: 请问func到底指向什麽鬼?? 还是是s2大说的转型呢? 07/10 21:33
7F:推 LiloHuang: 程式经过编译器编译後,会产生一连串的机器码资料 07/10 21:42
8F:→ LiloHuang: 当程式执行时指令机器码会被 Program Loader 加载到 07/10 21:43
9F:→ LiloHuang: 记忆体,进而让内部或外部的程式执行该片段指令 07/10 21:44
10F:→ LiloHuang: 那段程式码在有开 DEP 的机器上,通常执行都会失败 07/10 21:44
11F:→ LiloHuang: 通常我们会用 VirtualAlloc 或 mmap 等 API 来配置一段 07/10 21:45
12F:→ LiloHuang: 可读可写可执行的区块,把指令机器码搬过去该区块 07/10 21:45
13F:→ LiloHuang: 这也是 JIT 重要的环节之一,动态产生可执行的机器码 07/10 21:47
14F:→ LiloHuang: 至於那个就是转型,做出 function call 所需要的动作 07/10 21:47
15F:→ LiloHuang: 如把参数 push 到 stack (视 calling convention 而定) 07/10 21:48
16F:→ LiloHuang: 进而执行该机器码指令 (已尽量用浅显文字描述 XD) 07/10 21:49
17F:→ LiloHuang: 有兴趣可以去选修 compiler 的相关课程 07/10 21:50
18F:→ LiloHuang: 转型成 function pointer (callable) 07/10 21:51
19F:→ LiloHuang: func 实际上就是直接指到那块阵列,可以再进行呼叫动作 07/10 22:01
20F:→ ctrlbreak: 会组语的秒懂 07/10 22:02
21F:→ LiloHuang: 有兴趣的人可以玩玩 Compiler Explorer - C++ 07/10 22:03
23F:→ LiloHuang: 对於刚入门编译器设计,或者不懂组语的多少有些帮助 07/10 22:03
24F:→ zarados: 感谢Lilo大大的开释 谢谢!! 07/10 22:18
25F:推 s25g5d4: 原 PO 看得懂 int (*func)(); 已经很猛了 07/11 00:22
26F:推 seanwu: 如果想自己测试的话,gcc加-zexecstack,这是关DEP 07/11 06:59
27F:→ seanwu: 搭配gdb下lay asm,可以si去跟看看 07/11 07:00
28F:→ zarados: 弱弱的说一句其实我懂组语 但自学的没有很扎实... 07/11 08:57
29F:推 Qoofate: (int)(*func)(); 这行是呼叫执行吗? 07/11 10:41
30F:→ s25g5d4: 这行其实是宣告...XD 07/11 12:58
31F:→ s25g5d4: 阿 看错行 这行是执行 07/11 13:00
32F:推 LPH66: 第一行宣告, 第二行转型, 第三行执行 07/11 16:25
33F:→ LPH66: 基本上第二行写成那样是为了符合 C 语言的规则 07/11 16:27
34F:→ LPH66: 你必须要取得一个函式指标才能进行间接呼叫 07/11 16:27
35F:→ LPH66: 第二行那个转型就是把字串指标硬转成函式指标 07/11 16:28
36F:→ freef1y3: 执行应该 (*func)(); 就可以了吧? 07/11 16:57
37F:→ freef1y3: (int) 应该是把回传值转型, 可是执行完 shellcode 07/11 17:02
38F:→ freef1y3: 程式就跳掉了, 应该也用不到回传值 07/11 17:03
39F:推 steve1012: 这边的懂组语是指compiler 的课吗 还是architecture 07/12 01:41
40F:推 b0920075: 原Po是在看ais3 2015的writeup吗XDD 07/12 21:47
41F:推 Bencrie: 执行不是直接 func(); ? 07/13 00:54
42F:推 Bencrie: 测过两种都能跑,直接写 func(); 比较容易懂 07/13 00:57
43F:推 TobyH4cker: 阿靠 忘了要做AIS 07/13 12:23
44F:推 b0920075: 楼上还有时间 07/13 16:40
45F:推 cobrasgo: 要玩这东西请找旧一点的os + 旧shell 07/14 08:11