2016-05-27 6 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

バイナリgetenvを使用する場合は、プログラムfooの環境変数のアドレスが推測されます。

プログラム名は環境変数の前にありますので、元のプログラムの名前が長いか短い場合は、環境変数のアドレスが変更されます。

これは、getenvプログラム名の長さをenvアドレスに引き、代わりにfooバイナリ名の長さを追加する理由です。

関連する問題