2016-05-27 17 views
0

Kürzlich lerne ich etwas Experiment über ret2libc Exploit, fand ich, dass wir die Umgebungsvariable verwenden können, Payload zu speichern, und der folgende Code getenv.c kann uns helfen, den Speicherort zu bekommen die Umgebungsvariable:Holen Sie den Speicherort der Umgebungsvariable beim Versuch, ret2libc Exploit

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

Es macht mich so verwirrt, dass der ptr Wert nicht di verwendet wird:

#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); 

} 

wir das Programm auf diese Weise nutzen können rectly, aber tun die adujstment (strlen(argv[0]) - strlen(argv[2])); Warum?

Antwort

0

Die Umgebungsvariable Adresse im Programm foo wird geschätzt, wenn Sie Ihre getenv Binärdatei verwenden.

Der Programmname steht vor den Umgebungsvariablen. Wenn der Name des ursprünglichen Programms länger oder kürzer ist, werden die Adressen der Umgebungsvariablen geändert.

Deshalb subtrahieren Sie die Programmnamenslänge getenv der env-Adresse und fügen stattdessen die binäre Namenlänge foo hinzu.