|
char mycode[] =
"\xeb\x19\x5e\x31\xc0\x89\xc3\x89"
"\x46\x0c\xb0\x04\x89\xf1\x31\xd2"
"\xb2\x0c\xcd\x80\x31\xdb\x89\xd8"
"\x40\xcd\x80\xe8\xe2\xff\xff\xffHello world!";
void foo()
{
char buf[14];
int *ret;
ret = (int*)(buf + 28);
(*ret) = (int)mycode;
}
main()
{
foo();
return 0;
}
在gcc 3.2.2 环境下调试通过。生成那段字符串是根据下面的汇编代码生成的:
void main()
{
__asm__("
jmp 1f
2:popl %esi
xorl %eax,%eax
movl %eax,%ebx
movl %eax,0xc(%esi)
movb $0x4,%al
movl %esi,%ecx
xorl %edx,%edx
movb $0xc,%dl
int $0x80
xorl %ebx,%ebx
movl %ebx,%eax
inc %eax
int $0x80
1:call 2b
.string \"Hello world!\"");
}
;) 知道攻击方法才知道防御方法,有效的防止这种溢出攻击建议在你的程序中用上Libsafe。但是有一点需要注意,就是Libsafe只对动态链接库有保护作用,而对于静态链接库,则只能从代码上小心谨慎了。特别是在做网络游戏的时候,接收网络消息的buffer一定要小心谨慎的处理因为一个不慎被溢出并注入一些有攻击行为的代码,就比较恐怖了。 |
|