最近在学习一些关于ret2libc exploit的实验,我发现我们可以使用环境变量来存储payload,下面的代码getenv.c
可以帮助我们获取payload的位置环境变量:
#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 将位于 0xbfffff22
这让我很困惑,ptr
值不是直接使用的,而是做调整 (strlen(argv[0]) - strlen(argv[2]))
;为什么?
最佳答案
程序 foo
上的环境变量地址是在使用 getenv
二进制文件时猜测的。
程序名在环境变量之前,所以如果原程序名变长或变短,都会改变环境变量地址。
这就是为什么要将 getenv
程序名称长度减去 env 地址,并添加 foo
二进制名称长度。
关于linux - 尝试 ret2libc 利用时获取环境变量的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37476379/