我有一个环境变量,我正在尝试获取其内存地址。我有
memset(&buffer, 0x90, 517);
memcpy(&buffer[517-strlen(shellcode)],shellcode,strlen(shellcode));
setenv("EGG",buffer,1);
putenv(buffer);
printf("EGG address: 0x%1x\n", getenv("EGG"));
system("bash");
打印出的内存地址为0x804b00c
。这看起来不正确。我用GDB x / x 0x804b00c
检查了它。它说无法访问0x804b00c
的内存。所以getenv
基本上给了我垃圾记忆。我已调用env
以确保EGG
变量已设置,并且确实如此。
为什么我不能获得EGG
的内存地址?
答案 0 :(得分:2)
感谢这个问题,另一个学习机会!
已将您的代码提炼为以下内容:
#include <stdio.h>
#include <stdlib.h>
void main()
{
const char shellcode[] = "EGG=whatever";
putenv(shellcode);
printf("EGG address @%08X\n", getenv("EGG"));
printf("EGG value is <%s>.", getenv("EGG"));
}
此代码适用于Eclipse / Microsoft C编译器环境。注意,我没有必要调用setenv或bash或发出系统命令。在此示例中,为流程设置了环境变量EGG。
另外,请注意EGG的地址与其实际值之间的差异。在第一种情况下,getenv返回一个char *
,它是一个指向存储的指针,由printf语句的%08X
部分定义,而%s
实质上是取消引用getenv返回的char指针。此外,getenv()通过#include <stdlib.h>
语句找到。
答案 1 :(得分:1)
初步答案是你有很少的Endian硬件。因此,在半字内的半字和字节SWAPPED中存储字(4个字节,在字边界处对齐)。 0x0804b00c更可能真的在0x0cb04b80。
将尝试编写我自己的c代码来做你想做的事情并发布第二张便条。