我对构建和操作系统都很陌生,所以我想我会玩弄一些东西,我试着看看是否可以打印进程内存的文本部分。 / p>
据我了解,内存是" text ||堆||酉|| stack",地址从左到右增加。因此,如果我从堆栈中的某个地址开始并向下移动,我最终应该点击文本。
所以我写了这个C程序:
#include <stdio.h>
int main()
{
char s='a';
long int i=0;
unsigned char* byte_array= &s;
while (1){
printf("%02x",*(byte_array-i));
i++;
}
}
很高兴地打印出一堆乱七八糟的十六进制,而不是惊人数量的0,然后有一个分段错误。我的猜测是0是单位数据 - 但为什么它不能继续读取文本段?进程是否具有对其自己的代码的读取权限?如果是这样,为什么我无法达到它?
要检查它是否在0运行之前没有读取它的代码,我将可执行文件打开为十六进制,选择一个随机的短子串,并在我的程序输出中搜索它。它不在那里。
如果进程可以读取自己的代码,我该怎么做?
这是在OS X 10.11.6上运行的,用clang编译,如果改变的话。