最近我学习了一些关于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]))
;为什么呢?
答案 0 :(得分:0)
使用foo
二进制文件时,会猜出程序getenv
上的环境变量地址。
程序名称位于环境变量之前,因此,如果原始程序的名称更长或更短,它将更改环境变量地址。
这就是您将getenv
程序名称长度减去env地址的原因,并添加foo
二进制名称长度。