linux - 尝试 ret2libc 利用时获取环境变量的位置

标签 linux gdb exploit

最近在学习一些关于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/

相关文章:

无法在 linux 中绑定(bind)套接字

c - Linux : Signal : SIGUSR1 : Signal Handler : Measuring execution time?

c++ - 为了准确地对其进行基准测试,我应该使一个大函数成为原子吗?

GDB:远程加载共享库时出错

c - 确定传递给函数的参数

c - Linux : Buffer overflow of simple C program is giving SIGBUS

javascript - 我不明白这段代码

ruby - 以编程方式编辑 crontab 并强制守护进程刷新

c++ - 有没有办法为 gdb 中的所有断点设置一个条件来调试 Cpp 代码?

c - 漏洞利用:SIGSEGV、段错误