【发布时间】:2018-10-15 12:24:46
【问题描述】:
我编写了下面的代码来测试 shellcode(用于取消链接 /tmp/passwd)在安全类中的分配。
当我使用 gcc -o test -g test.c 编译时,我在跳转到 shellcode 时遇到了段错误。
当我使用 execstack -s test 对二进制文件进行后处理时,我不再遇到段错误并且 shellcode 正确执行,删除了 /tmp/passwd。
我正在运行gcc 4.7.2。要求堆栈可执行以使堆可执行似乎是个坏主意,因为后者的合法用例比前者多得多。
这是预期的行为吗?如果有,原因是什么?
#include <stdio.h>
#include <stdlib.h>
char* shellcode;
int main(){
shellcode = malloc(67);
FILE* code = fopen("shellcode.bin", "rb");
fread(shellcode, 1, 67, code);
int (*fp)(void) = (int (*) (void)) shellcode;
fp();
}
这是xxd shellcode.bin的输出:
0000000: eb28 5e89 760c 31c0 8846 0bfe c0fe c0fe .(^.v.1..F......
0000010: c0fe c0fe c0fe c0fe c0fe c0fe c0fe c089 ................
0000020: f3cd 8031 db89 d840 cd80 e8d3 ffff ff2f ...1...@......./
0000030: 746d 702f 7061 7373 7764 tmp/passwd
【问题讨论】:
-
@HansPassant,NX 似乎可用于页表条目的粒度。该技术与我的问题有些正交,我的问题是关于将堆栈和堆保护合二为一的基本原理。