我正在使用父進程,它使用execve()來運行具有我在父進程中定義的特定環境變量的子進程。 在父進程中,如果我查看內存位置$ esp + 0x240,我會找到所有的環境變量。但是,一旦子進程啓動,我無法找到已存儲預定義環境變量的內存地址。使用execve()運行子進程的環境變量
我會想,因爲execve()用子進程替換父進程,傳遞給子進程的環境變量將位於0xbffffffa減去環境變量字符串的長度(在Linux中)。 但是,當啓動子進程時,我不再有權訪問內存中的那個位置。在調用execve()之前,父進程的esp是0xbffff120,一旦子進程啓動,esp跳轉到0xbf9835a0。 (我猜這是因爲子進程具有父進程沒有的root權限) 現在,當我從堆棧頂部查看內存直到無法再訪問內存時,沒有對從父進程傳遞的任何環境變量進行簽名。它們位於何處?還有一個更一般的說明,當你運行一個進程時,環境變量都被複制到堆棧底部的內存中的高端?
#include <stdio.h>
#include <stdlio.h>
#include <string.h>
#include <unistd.h>
char envvari[]=
"\x31\xc0\ ...." // Can be any environment variable
int main(int argc, char *argv[]) {
char *env[2] = {envvari, 0};
unsigned int i, ret;
char *buffer = (char *) malloc(160);
char *args[] = {"notesearch", buffer, 0};
ret = 0xbffffffa - (sizeof(envvari)-1) - strlen("./notesearch");
for(i=0; i < 160; i+=4)
*((unsigned int *)(buffer+i)) = ret;
execve("./notesearch", args, env);
free(buffer);
}
請不要*描述*代碼,它實際上*顯示*代碼更好。 –
沒有一些代碼,你不會得到有用的答案。 +1 @Joachim Pileborg –
你們中的一些人可能在書中看到了這個代碼的例子:Jon Erickson的'剝削藝術'。 –