linux漏洞挖掘基础--缓冲区溢出基础实例(protostar stack0)

初学,记录,欢迎指点批评。。。

用的是http://exploit-exercises.com/网站上的protostar虚拟机镜像

缓冲区溢出原理就不提了

缓冲区溢出第一关stack0

#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>
int main(int argc, char **argv)
{
    volatileint modified;
    char buffer[64]; 
    modified = 0; 
    gets(buffer); 
    if(modified != 0) {
        printf("you have changed the 'modified' variable\n");
    } else { 
        printf("Try again?\n");
    } 
}

这也是最简单的一关,直接看他给的代码就知道直接输入65个字符就行了。不过能看出来不行,还得看到里面去,它为什么能行。

进入/opt/protostar/bin下

gdb stack0

命令:disas main 反汇编main函数如下图显示



main+0到main+6都是函数初始化指令

给main函数下断点 : b main

运行:r 或 run

看下各寄存器:info reg


可以 看到eip指向0x80483fd就是main+9,通过一开始的反汇编知道该处指令是movl $0x0,0x5c(%esp) 是modified = 0

单步执行:n 或 next

main+17:lea $0x1c(%esp),%eax  ; char buffer[64]        //0x5c减去0x1c正好是十进制的64

单步执行 : n  就要开始输入数据,输入的数据长度为65个字符

通过代码知道定义的缓冲区长度是64,我们输入65个字符肯定放不下。前面知道%esp+0x5c即modified的值的地址,值为0

可以看到现在modified的值已经是A,所以源代码中的判断if(modified != 0)为真,打印

如下

成功溢出,改变modified 的值。

posted @ 2014-01-05 15:48  xss  阅读(1008)  评论(0编辑  收藏  举报