当前位置: 技术问答>linux和unix
fedora core 2 对于缓冲区溢出攻击有保护措施么?程序能不能ret回数据段(堆栈段)执行?
来源: 互联网 发布时间:2015-09-07
本文导语: 我的系统是fedora core 2 做一个buffer overflow的练习时遇到的问题, void main() { int val; printf( "Type Hex string: "); val = getbuf(); printf( "getbuf returned 0x%xn ", val); } int ...
我的系统是fedora core 2
做一个buffer overflow的练习时遇到的问题,
void main()
{
int val;
printf( "Type Hex string: ");
val = getbuf();
printf( "getbuf returned 0x%xn ", val);
}
int getbuf()
{
char buf[12];
getxs(buf);
return 1;
}
向buf[]中写入8byte数据,覆盖saved %ebp和返回地址,将ret的返回地址覆盖为已有的任意instruction 地址,成功
但如果将ret的返回地址覆盖为当前程序(getbuf)的栈桢(stack frame)中的数据的地址(如buf[]的地址,假设从buf[0]处开始输入了一些机器指令),则程序在getbuf的返回指令ret处报错,segment fault
注:在gdb下运行该程序,在getbuf处设断点,打印出%ebp,%esp,buf[]地址,再continue,继续执行,我是这样来得到buf[]地址的,运行到断点后,print /x ($ebp-24),因为从getbuf的汇编结果看,buf[]地址是这样得到的 leal 0xffffffe8(%ebp),%eax
push %eax
这里没有搞明白,想修改返回地址让程序转去执行我们在buf[]中输入的机器指令,到底该怎么做呢?
有没有可能是fedora core 2采取了保护措施,不让数据段可执行,尤其是堆栈段呢?
做一个buffer overflow的练习时遇到的问题,
void main()
{
int val;
printf( "Type Hex string: ");
val = getbuf();
printf( "getbuf returned 0x%xn ", val);
}
int getbuf()
{
char buf[12];
getxs(buf);
return 1;
}
向buf[]中写入8byte数据,覆盖saved %ebp和返回地址,将ret的返回地址覆盖为已有的任意instruction 地址,成功
但如果将ret的返回地址覆盖为当前程序(getbuf)的栈桢(stack frame)中的数据的地址(如buf[]的地址,假设从buf[0]处开始输入了一些机器指令),则程序在getbuf的返回指令ret处报错,segment fault
注:在gdb下运行该程序,在getbuf处设断点,打印出%ebp,%esp,buf[]地址,再continue,继续执行,我是这样来得到buf[]地址的,运行到断点后,print /x ($ebp-24),因为从getbuf的汇编结果看,buf[]地址是这样得到的 leal 0xffffffe8(%ebp),%eax
push %eax
这里没有搞明白,想修改返回地址让程序转去执行我们在buf[]中输入的机器指令,到底该怎么做呢?
有没有可能是fedora core 2采取了保护措施,不让数据段可执行,尤其是堆栈段呢?
|
目前很多的操作系统都禁止了在堆栈区执行指令,估计Linux也不会差到哪里去,这种程度的保护应该还是有的
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。