点击蓝字
关注我们
第一关 Stack0
第一关的代码如下所示:
简单理解第一关就是程序可以输入一些值,假如没超过64个字节返回Try again?超出缓冲区容量会返回you have changed the ‘modified’ variable,我们的目标就是让程序溢出返回you have changed the modified variable
int main(int argc, char **argv)
{
volatile int modified; //设置关键词 int也许会被某种方式修改
char buffer[64]; //设置缓冲区空间字节容量为64
modified = 0 ;//初始化modified的值
gets(buffer); //允许我们输入”buffer”的值可以理解我们输入的值会顺便丢到缓冲区中
if(modified != 0) {
printf("you have changed the 'modified' variablen");
} else {
printf("Try again?n");
}
}
第二关 Stack1
源代码如下:
int main(int argc, char **argv)
{
volatile int modified;
char buffer[64];
if(argc == 1) {
errx(1, "please specify an argumentn");
}
modified = 0;
strcpy(buffer, argv[1]);
if(modified == 0x61626364) {
printf("you have correctly got the variable to the right valuen");
} else {
printf("Try again, you got 0x%08xn", modified);
}
}
1.先看main函数这里,创建一个关键词int 变量叫modified,并且给buffer分配64字节的缓冲区空间
volatile int modified;
char buffer[64];
if(argc == 1) {
errx(1, "please specify an argumentn");
}
3.首先初始化modified这个值,然后使用strcpy 复制功能把argv[1]的值复制到modified的缓冲区空间中
modified = 0;
strcpy(buffer, argv[1]);
4.最后就是检测变量的值是否等于0x61626364(dcba的16进制的值)
if(modified == 0x61626364) {
printf("you have correctly got the variable to the right valuen");
}else{
printf("Try again, you got 0x%08xn", modified);
}
如果我们想要得到答案you have correctly got the variable to the right value,
我们要把值设置成0x61626364(由于是0x开头可以确认是16进制)。然后由于有strcpy函数会把我们输入的功能丢到buffer缓冲区里面。假如我们不把数据冲出buffer以外,modified会默认为0不会显示答案。所以要先溢出再添加dcba
正常执行由于没有参数会提示请输入参数
随便输入点东西由于输入的字节在缓冲区容量之类没溢出,所以modified的值没改变
那么先利用python生成64个a然后再末尾处添加dcba
然后运行即可
第三关 Stack2
int main(int argc, char **argv)
{
volatile int modified;
char buffer[64];
char *variable;
variable = getenv("GREENIE");
if(variable == NULL) {
errx(1, "please set the GREENIE environment variablen");
}
modified = 0;
strcpy(buffer, variable);
if(modified == 0x0d0a0d0a) {
printf("you have correctly modified the variablen");
} else {
printf("Try again, you got 0x%08xn", modified);
}
}
继续拆分
1.还是一样先定义一个关键词int modified,然后分配给buffer缓冲区空间64个字节。这次还多了一个新的变量叫variable,从一个名为GREENIE的环境变量获取值
Volatile int modified;
Char buffer[64]
Variable = getenv(“GREENIE”)
2.检查variable是否为空
if(variable == NULL){
Errx(1, “please set the GREENIE environment variablen”)
3.设置modified初始值为0
Modified = 0;
4.利用strcpy复制功能把variable赋值给buffer
Strcpy(buffer, variable)
5.检测modified的值是否为0x0d0a0d0a
if(modified == 0x0d0a0d0a) {
printf(“you have correctly modified the variablen”);
} else {
printf(“Try again, you got 0x%08xn”, modified);
首先需要理解一下什么是环境变量值(environment variable)。简单的理解就是环境变量是用来存储某些东西的值的变量,系统可以使用这些东西同时服务也可以访问这些变量。
比如说打印波 环境变量$BASH的值会返回/bin/bash
如果我们想要运行bash的话直接在终端输入bash而不是/bin/bash因为系统会自己找到变量$BASH并直接读取/找到它的路径。
但系统不会给每个二进制文件存储一个变量,所以一个新的变量PATH诞生了,它是用来解决这个问题的。该变量会包含bin或者是dir。当我们在终端敲python的时候它会在这些目录中查找然后执行python
不输入任何东西直接运行是这样的直接走第二条语句检测是否为空
那么这里就需要设置环境变量为GREENIE(也没有环境变量叫GREENIE)才能继续往下走。同时要得到答案还需要满足modified的值为0x0d0a0d0a,这题跟上题比较类似也是需要先溢出覆盖才可。
这次无法直接使用ASCII码的值由于0x0d还有r的意思 0x0a=另起一行n的意思。所以只能直接打16进制的值进去然后执行
GREENIE = `python -c “print(‘a’ * 64 + ‘0xa0xbx0ax0b’)”`
先创建一个环境变量GREENIE,然后导入最后执行就可
微信公众号|神隐攻防实验室
关注我们 | 获取更多精彩
神隐攻防 ·
点个
在看
你最好看
原文始发于微信公众号(神隐攻防实验室):萌新学习缓冲区溢出漏洞(2.基础题)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论