2013-06-21 121 views
0

我正在使用父進程,它使用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

請不要*描述*代碼,它實際上*顯示*代碼更好。 –

+0

沒有一些代碼,你不會得到有用的答案。 +1 @Joachim Pileborg –

+0

你們中的一些人可能在書中看到了這個代碼的例子:Jon Erickson的'剝削藝術'。 –

回答

1

execve()不創建子進程。它只是取代現有的流程。另外,execve()永遠不會返回。 fork()是創建子進程的系統調用。如果execve()成功,execve()之後的自由(緩衝區)調用將永遠不會執行。

相關問題