2013-02-14 97 views
3

我有一個環境變量,我試圖獲取它的內存地址。我有獲取環境變量的地址

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的內存地址?

+1

除了你自己,這對任何人來說幾乎是不可能的。變量太多。告訴你的環境變量所處的地址是沒有意義的,它可能在任何地址。 – 2013-02-14 23:08:41

+0

你知道環境變量存儲在你自己的進程中,對吧? – 2013-02-14 23:14:27

+3

爲什麼你需要一個環境變量的地址?你打算如何處理它? – 2013-02-14 23:26:28

回答

1

初步的答案是,你有小Endian硬件。因此,單詞(4個字節,在字邊界對齊)與半字和字節內的半字節和SWAPPED字節一起存儲。 0x0804b00c更可能真的在0x0cb04b80。

將嘗試編寫我自己的c代碼來做你想做的,並會發布第二個音符。

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>聲明找到。