非安全编程演示之格式化字符串(2)
2006-04-02 20:26:42 来源:WEB开发网
user@CoreLabs:~/gera$ objdump -R ./fs3
./fs3: file format elf32-i386
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
080495cc R_386_GLOB_DAT __gmon_start__
080495bc R_386_JUMP_SLOT __register_frame_info
080495c0 R_386_JUMP_SLOT __deregister_frame_info
080495c4 R_386_JUMP_SLOT __libc_start_main
080495c8 R_386_JUMP_SLOT snprintf
user@CoreLabs:~/gera$
这种覆盖__deregister_frame_info()地址的技术是Core Security Team首次发现和公布的。一般来说,这是一个在所有GCC的动态连接可执行程序中存在的函数。它在一个函数结束时--通过调用exit(),return()之类的函数--被调用。覆盖它的地址与覆盖GOT内任何函数地址的效果是一样的。然而,在这里例子中在GOT里没有合适的函数。
溢出这个例子的唯一途径就是用0xb f f f覆盖__deregister_frame_info()的两个最高有效字,同时把shellcode保存在stack里面(shellcode前面放一堆NOP)。从上面objdump的输出来看,__deregister_frame_info()的地址为0x080495c0。覆盖后,将变为0xb f f f 95c0。shellcode的地址就在这附近----通过NOP在增大落在shellcode范围的几率。
为了覆盖成功,argc[1]必须为49151 - 2 = 49149 字节长,包括了shellcode和
__deregister_frame_info()的地址。argc[1]会被放入内存(栈)中,比如从0xb f f f f a d7到0xb f f f 3a d 7。这里唯一可能存在的问题就是如果__deregister_frame_info()的两个最低有效字大于0xf a d 7或小于0x3 a d 7(这样就不会落在NOP里)。根据统计学来看,这种情况的概率是25%,但是实际情况中(由于考虑到linux的内存分配)将小于1%(译者注:就是说成功率会比较高)。
更多精彩
赞助商链接