一个简单的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&#61;0;i
{
if((psz[i]&#39;z&#39;))
return 0;
total&#43;&#61;psz[i];
}
if(total%853&#61;&#61;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()函数发生了溢出。我们先把验证成功分支的地址也记下来&#xff1a;0x0x080485ea。接下来进入valid_serial()函数第一条指令&#xff0c;把validate_serial()函数返回地址对应的esp值也记下来&#xff1a;0xbffff48c
接下来出动pattern_create.rb和pattern_offset计算偏移
先
pattern_create 100
创建100个字符&#xff0c;然后把这100字符传给程序
发生了溢出导致段错误&#xff0c;看看前面esp0xbffff48c指向的地址是什么内容
很好&#xff0c;0x41326241覆盖了返回地址&#xff0c;然后用pattern_offset.rb计算多少字符覆盖到返回地址
接下来就简单了&#xff0c;利用格式如下
36个填充字符&#43;验证成功分支的地址
do it !!!