尝试ret2libc exploit时获取环境变量的位置

时间:2016-05-27 06:33:04

标签: linux gdb exploit

最近我学习了一些关于ret2libc漏洞利用的实验,我发现我们可以使用环境变量来存储有效负载,以下代码getenv.c可以帮助我们获取环境变量的位置:

#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值没有被直接使用,而是使用adujstment (strlen(argv[0]) - strlen(argv[2]));为什么呢?

1 个答案:

答案 0 :(得分:0)

使用foo二进制文件时,会猜出程序getenv上的环境变量地址。

程序名称位于环境变量之前,因此,如果原始程序的名称更长或更短,它将更改环境变量地址。

这就是您将getenv程序名称长度减去env地址的原因,并添加foo二进制名称长度。