我创建了一个环境变量SHELLCODE,其中包含一个200字节长的NOP底座和一个shellcode。它存储在0x7fffffffe285285,但我将尝试访问0x7fffffffe2e5,它位于NOP底座的中间。
然后,我编写了以下代码来尝试访问该变量。
#include <stdlib.h>
int main() {
char *pointer = 0x00007fffffffe2e5;
printf("%s\n", *pointer);
}
我用gdb查看内存
(gdb) list 1
1 #include <stdio.h>
2
3 int main() {
4 char *pointer = (char *) 0x00007fffffffe2e5;
5 printf("%s\n", *pointer);
6 }
(gdb) break 5
(gdb) run
(gdb) p pointer
$1 = 0x7fffffffe2e5 '\220' <repeats 119 times>, "\061\300\061\333\061ə\260\244̀j\vXQh//shh/bin\211\343Q\211\342S\211\341̀"
(gdb) p *pointer
$2 = -112 '\220'
(gdb) p/x *pointer
$3 = 0x90
(gdb) c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a5bcc0 in _IO_vfprintf_internal (
s=0x7ffff7dd2620 <_IO_2_1_stdout_>, format=<optimized out>,
ap=ap@entry=0x7fffffffdc58) at vfprintf.c:1632
1632 vfprintf.c: No such file or directory.
指针显然指向NOP底座的中间,并且gdb可以访问并查看该地址的内容。但是我一直收到这个细分错误错误。
这是因为不允许C程序访问存储环境变量的内存吗?如果是这样,是否有办法允许它访问内存?
我正在使用Ubuntu 16.04和gcc 5.4.0。 预先感谢。
答案 0 :(得分:1)
getenv
函数用于检索环境变量的值:
const char *shellcode = getenv("SHELLCODE");