一个简单的linux缓冲区利用

by Netfairy - 2016-02-28

刚开始接触linux下的漏洞利用,先做个练练手。程序源码如下:

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int valid_serial(char * psz)
{
    size_t len=strlen(psz);
    unsigned total=0;
    size_t i;
    if(len<10)
        return 0;
    for(i=0;i<len;i++)
    {
        if((psz[i]<'0')||(psz[i]>'z'))
            return 0;
        total+=psz[i];
    }
    if(total%853==83)
        return 1;
    return 0;
}
int validate_serial()
{
    char serial[24];
    fscanf(stdin,"%s",serial);
    if(valid_serial(serial))
       return 1;
    else
       return 0;
}
int do_valid_stuff()
{
    printf("The serial number is valid!\n");
    exit(0);
}
int do_invalid_stuff()
{
    printf("Invaild serial number!\nExiting...\n");
    exit(1);
}
int main()
{
    if(validate_serial())
      do_valid_stuff();
     else
      do_invalid_stuff();
     return 0;
}

1.png

然后用gdb调试它

gdb test

start

disas main

2.png

注意到是validate_serial()函数发生了溢出。我们先把验证成功分支的地址也记下来:0x0x080485ea。接下来进入valid_serial()函数第一条指令,把validate_serial()函数返回地址对应的esp值也记下来:0xbffff48c

3.png

接下来出动pattern_create.rb和pattern_offset计算偏移

pattern_create 100 

4.png

创建100个字符,然后把这100字符传给程序

5.png

发生了溢出导致段错误,看看前面esp 0xbffff48c指向的地址是什么内容

6.png

很好,0x41326241覆盖了返回地址,然后用pattern_offset.rb计算多少字符覆盖到返回地址

7.png

接下来就简单了,利用格式如下

36个填充字符+验证成功分支的地址

8.png

do it !!!