PWN練習之環境變量繼承

一、環境變量參數:

      在Linux/Windows操作系統中, 每個進程都有其各自的環境變量設置。 缺省情況下, 當一個進程被創建時,除了創建過程中的明確更改外,

它繼承了其父進程的絕大部分環境變量信息。 擴展的C語言main函數可以傳遞三個參數,除了argc和argv參數外,還能接受一個char**類型

的envp參數。envp指向一個字符串數組,該數組存儲了當前進程具體的環境變量的內容,envp的最後一個元素指向NULL,此爲envp結束的

標識符。如下代碼可以打印環境變量:

#include <stdio.h>

int main(int argc,char** argv,char** envp){

int i =0;

while(envp[i]){

printf("envp[%2d] = %s\n", i, envp[i]);

+=1;

}

return0;

}

環境變量的格式爲:環境變量名=環境變量值

當父進程啓動一個子進程時,子進程會繼承父進程的換了變量信息。在Linux Shell下,通過export可以給Shell添加一個環境變量,此後通過

Shell啓動的子進程都會擁有這個環境變量。除了通過export添加環境變量以外,我們還可以通過函數getenv、putenv、setenv等對環境變量進行

操作。 Python的os模塊提供創建子進程以及修改環境變量的函數,其中os.system函數可以創建一個子進程,且子進程會繼承父進程的環境變量參數信息;os.putenv可以修改進程的環境變量參數信息。

二、關於Linux

Linux Shell中,可以使用$()或者兩個反引號(`)來包裹一條shell命令,並返回shell命令的執行結果。比如執行

export testenv2=`python -c "print 'A'*20"`

命令後,再執行./env可以看到有一個名爲testenv2的環境變量,其值爲20個A。

三、


getenv函數以一個字符串首地址爲參數,這個字符串爲環境變量名。返回值在eax中,存的內容爲環境變量參數字符串首地址。

tips:

python輸出不可打印字符時,可以使用“\x”,如print '\x0a\x0d\x0a\x0d'。

python修改環境變量(HEETIAN=AAA):

os.putenv("HEETIAN","AAA")

int execve(const char * filename,char * const argv[ ],char * const envp[ ]);可以設置執行一個進程的參數與環境變量

#include<unistd.h>
main()
{
char * argv[ ]={"ls","-al","/etc/passwd",(char *)0};
char * envp[ ]={"PATH=/bin",0};
execve("/bin/ls",argv,envp);
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章