- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我编写了下面的代码来测试 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
最佳答案
真正的“意外”行为是设置标志使堆 和堆栈一样可执行。该标志旨在与生成基于堆栈的 thunk 的可执行文件一起使用(例如当您获取嵌套函数的地址时的 gcc)并且不应该真正影响堆。但是 Linux 通过全局使所有可读页面可执行来实现这一点。
如果你想要更细粒度的控制,你可以使用 mprotect
系统调用来控制每页的可执行权限——添加如下代码:
uintptr_t pagesize = sysconf(_SC_PAGE_SIZE);
#define PAGE_START(P) ((uintptr_t)(P) & ~(pagesize-1))
#define PAGE_END(P) (((uintptr_t)(P) + pagesize - 1) & ~(pagesize-1))
mprotect((void *)PAGE_START(shellcode), PAGE_END(shellcode+67) - PAGE_START(shellcode),
PROT_READ|PROT_WRITE|PROT_EXEC);
关于c - 为什么需要execstack才能在堆上执行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50184682/
我正在破解一个需要主机应用程序允许可执行堆栈的插件。 这可以通过运行来实现 execstack -s /path/to/my/host 但是,如果主机应用程序缺少可执行堆栈 标志(例如,尚未调用上述命
我在这里有一些示例代码,我用它来理解初学者 CTF 的一些 C 行为: // example.c #include void main() { void (*print)();
我想用 execstack 在 CentOS 7.2 上将二进制文件标记为不需要可执行堆栈,但没有这样的实用程序和 yum没有找到包 execstack .为什么会这样?这个实用程序是不是现在不用了?
我是hadoop新手,在centos box上安装了hadoop 2.2.0。对于我在下面运行的任何 hdfs 命令,都是我收到的警告消息。感谢您的帮助。 Java HotSpot(TM) 64-Bi
我是一名优秀的程序员,十分优秀!