2013-02-14 4 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

Это почти невозможно, если кто-либо отлаживает, кроме вас самих. Слишком много переменных. Говорить, какой адрес живет в вашей переменной среды, является спорным, он может быть по любому адресу. –

+0

Вы понимаете, что переменные среды хранятся в вашем собственном процессе, верно? –

+3

Зачем нужен адрес переменной окружения? Что вы собираетесь с этим делать? –

ответ

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 *, который является указателем на хранение, как определено частью %08X инструкции printf, в то время как %s по существу отменяет указатель char, возвращенный getenv. Кроме того, getenv() найден через инструкцию #include <stdlib.h>.

Смежные вопросы