首页
社区
课程
招聘
[求助]利用缓冲区溢出执行指定的函数遇到的问题(有代码)
发表于: 2010-9-7 20:38 9340

[求助]利用缓冲区溢出执行指定的函数遇到的问题(有代码)

2010-9-7 20:38
9340
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>

int copy(char* input)

{
       
        char str[2];
       
    if(input) strcpy(str,input);
       
    return 0;
       
}

//ÕâÊÇÎÒÃÇÏëÒªËüÖ´ÐеÄÒ»¸öº¯Êý£¬Õý³£Çé¿öϲ»»áÖ´ÐÐ

int msg(void)
{
       
       
   MessageBox(NULL,"hhh","kkx",MB_OK);
       
    exit(0);
       
}
int main(int argc, char* argv[])
{
        printf("msgaddr is 0x%08x\n",msg);
        copy("AA\x05\x10\x40");
        return 0;
}
我想利用缓冲区的溢出去执行msg这个函数,为什么无法实现目的。我实在win7下做的 在我的机子上,msg的地址是00401005 请教各位

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
copy("AA\x05\x10\x40");
我感觉是这个赋值有问题,可是不知道该怎么写 谢谢
2010-9-7 20:54
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
copy("AA\x01\x01\x02\x03\x04\x01\x02\x03\x04\x05\x40\x10\x40");
我的地址是0x401040
2010-9-8 10:41
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
请问你x01\x01\x02\x03\x04\x01\x02\x03\x04\x05\这个是什么意思? 我是在win7下 所以地址和你不同 请教
2010-9-8 17:05
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我按照你的代码加上前面的还是不行啊 请教
2010-9-8 17:13
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
这个只能覆盖main函数的返回地址
你用OD调一下就知道了
2010-9-9 09:33
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我来猜一下
应该是copy("AA\x01\x02\x03\x04\x05\x06\x20\x10\x40");
str[2]在地址[ebp-4]处,占用两个字节,要对齐成4个字节,返回地址在[ebp+4],还要覆盖掉[ebp]的4个字节,所以要6个字节才能到达copy的返回地址。
这台机子没编译器,地址是我猜的,copy()的地址应该是401000,msg()的地址应该是401020,main()的地址应该是401040,直接用cl编译应该是这种情况。
不过这样的话msg的返回地址就乱了,应该会在弹出MessageBox后再弹出一个出错框吧。
2010-9-9 14:03
0
雪    币: 338
活跃值: (103)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
8
copy("\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xAA\x05\x10\x40");

Debug版
2010-9-9 16:00
0
雪    币: 338
活跃值: (103)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
9
为啥只能覆盖main的返回地址 不理解
2010-9-9 16:05
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
编译出来的代码不一样吧
2010-9-9 17:46
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢你 用你这个是完全可以达到目的的 能解释一下吗
2010-9-10 08:49
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=xiilin;856627]我来猜一下
应该是copy("AA\x01\x02\x03\x04\x05\x06\x20\x10\x40");
str[2]在地址[ebp-4]处,占用两个字节,要对齐成4个字节,返回地址在[ebp+4],还要覆盖掉[ebp]的4个字节,所以要6个字节才能到达copy的返回地址。
这台机子没...[/QUOTE]

你的这个在我的机子上也是可以的 但是你和kkmylove填充的字节数不一样 但是效果相同呢 谢谢
2010-9-10 08:54
0
雪    币: 317
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
copy函数前的返回地址  如图 00401124
目的是要覆盖他
copy函数后的返回地址  如图 00401005  就是int msg(void)那个函数的地址
但是我不知道多余的覆盖会不会出问题0013ff28  那个地址也覆盖了
上传的附件:
2010-9-10 12:56
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不一样么?一样的啊,都是填充了8个字节然后覆盖到位于[ebp+4]的返回地址。

终于换了这台机子,哈哈,有编译器了~恶搞一下。

copy("\x83\xec\x08\xe9\xa8\x8f\xff\xff\x20\x10\x40");

加了两条指令,刚好8个字节,构成一个死循环:-)

83 ec 08                sub        esp,8
e9 a8 8f ff ff        jmp        00401000

不过倒是发现一点挺好玩的,很显然字符串"\x83\xec\x08\xe9\xa8\x8f\xff\xff\x20\x10\x40"在.data区段,这个区段应该是不可执行的啊,为什么这里却可以执行?求指点。

上传附件,源代码和可执行文件。
上传的附件:
2010-9-11 01:32
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
[QUOTE=xiilin;856627]我来猜一下
应该是copy("AA\x01\x02\x03\x04\x05\x06\x20\x10\x40");
str[2]在地址[ebp-4]处,占用两个字节,要对齐成4个字节,返回地址在[ebp+4],还要覆盖掉[ebp]的4个字节,所以要6个字节才能到达copy的返回地址。
这台机子没...[/QUOTE]
你这里填充的是7个字节啊AA\x01\x02\x03\x04\x05\x06是7个字节 不是八个 所以我说不一样的 呵呵
2010-9-11 08:56
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
回复 xiilin
83 ec 08    sub  esp,8
e9 a8 8f ff ff  jmp  00401000
你这个跳转有问题啊 401000的16进制是061e68 在我机上运行你的附件会直接死掉
2010-9-11 09:18
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
AA相当于\x41\x41,是放在你的str[2]里的,按照你的1L的格式写成AA了,不是\xAA  



估计是你编译的时候"\x83\xec\x08\xe9\xa8\x8f\xff\xff\x20\x10\x40"这个字符串存放的地址跟我的不一样,我编译出来的偏移地址在00408050处存放的字符串,sub指令占用了3个字节,jmp指令是5个字节,就到了00408058了,所以00401000 - 00408058 = 8FA8,符号位扩展后就是FFFF8FA8了,根据你的偏移地址修改一下E9后面的数据吧,或者直接下载我上传的那个附件里面的exe然后调试。

效果只是不停地溢出,不停地执行msg()而已。
00408050    83EC 08         sub     esp, 8
00408053  - E9 A88FFFFF     jmp     00401000
00408058    2010            and     byte ptr [eax], dl
0040805A    40              inc     eax
0040805B    0000            add     byte ptr [eax], al
2010-9-11 11:58
0
雪    币: 348
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
感觉还是字符的问题!
2010-9-13 09:22
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
[QUOTE=xiilin;857305]AA相当于\x41\x41,是放在你的str[2]里的,按照你的1L的格式写成AA了,不是\xAA  

估计是你编译的时候"\x83\xec\x08\xe9\xa8\x8f\xff\xff\x20\x10\x40"这个字符串存放的地址跟我的不一样,我编译出来的偏...[/QUOTE]
你的字符串的存储地址是怎么算出来的啊 怎么找到的 谢谢
2010-9-13 23:05
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
调试的时候就可以看到啊,调用copy()时不是要先把字符串地址压栈么,这个就是啊。

只是恶搞一下而已,没啥实用性,呵呵,copy()返回时,返回到了msg(),而msg()返回时,恰好返回到了408050这个字符串地址。如果是学习的话,建议还是把返回地址覆盖到jmp esp,然后把shellcode写到后面吧,我也是初学溢出,说不出啥来,还是自己多调试吧。
2010-9-14 18:34
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
我调试的时候也把内存窗口调出来了啊 可是不知道该怎么去找那个字符串的地址 我在调试这块很弱 能说的细致一点吗 谢谢了
2010-9-15 17:29
0
游客
登录 | 注册 方可回帖
返回
//