一个简单的linux缓冲区利用by Netfairy - 2016-02-28
刚开始接触linux下的漏洞利用,先做个练练手。程序源码如下:
#include
#include
#include
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
{
if((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;
}
然后用gdb调试它
gdb test
start
disas main
注意到是validate_serial()函数发生了溢出。我们先把验证成功分支的地址也记下来:0x0x080485ea。接下来进入valid_serial()函数第一条指令,把validate_serial()函数返回地址对应的esp值也记下来:0xbffff48c
接下来出动pattern_create.rb和pattern_offset计算偏移
先
pattern_create 100
创建100个字符,然后把这100字符传给程序
发生了溢出导致段错误,看看前面esp0xbffff48c指向的地址是什么内容
很好,0x41326241覆盖了返回地址,然后用pattern_offset.rb计算多少字符覆盖到返回地址
接下来就简单了,利用格式如下
36个填充字符+验证成功分支的地址
do it !!!