2016-05-27 54 views
0

最近我正在學習一些關於ret2libc利用的實驗,我發現我們可以使用環境變量來存儲有效負載,並且下面的代碼getenv.c可以幫助我們獲得位置環境變量:獲取環境變量的位置當試圖ret2libc利用

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void main(int argc, char *argv[]) { 


    char *ptr; 
    if(argc < 3) { 
      printf("Usage: %s <environment var> <target program>\n", argv[0]); 
      exit(0); 
    } 

    ptr = getenv(argv[1]); /* Get env var location. */ 
    ptr += (strlen(argv[0]) - strlen(argv[2])); /* Adjust for program name. */ 
    printf("%s will be at %p\n", argv[1], ptr); 

} 

,我們可以使用該程序是這樣的:

$ ~/getenv FAV ./program FAV will be at 0xbfffff22

這讓我很困惑的是,ptr值不使用雙直接,但做的(strlen(argv[0]) - strlen(argv[2]));爲什麼?

回答

0

程序foo上的環境變量地址在使用getenv二進制文件時會被猜測。

程序名稱位於環境變量之前,所以如果原始程序的名稱長或短,它會更改環境變量地址。

這就是爲什麼您將getenv程序名稱長度減去env地址,並添加foo二進制名稱長度的原因。