在c语言中隐藏字符字符串

在c语言中隐藏字符字符串,c,string,C,String,我试图演示C中的格式化字符串漏洞。我希望避免strings命令在我的二进制文件中暴露ASCII字符串 以下是我的简单代码: #include <stdio.h> static char secret[] = "mysecretstring"; int main(int argc, char *argv[]) { char buf[64]; strncpy(buf, argv[1], sizeof(buf)); printf(buf); } #

我试图演示C中的格式化字符串漏洞。我希望避免strings命令在我的二进制文件中暴露ASCII字符串

以下是我的简单代码:

#include <stdio.h>    
static char secret[] = "mysecretstring";
  int main(int argc, char *argv[]) {
    char buf[64];
    strncpy(buf, argv[1], sizeof(buf));
    printf(buf);
  }
#包括
静态字符秘密[]=“mysecretstring”;
int main(int argc,char*argv[]){
char-buf[64];
strncpy(buf,argv[1],sizeof(buf));
printf(buf);
}

您可以用它做一些数学运算,例如:

static unsigned char secret[] = {'m' + 10, 'y' + 10, 's' + 10, 'e' + 10, 'c' + 10, 'r' + 10, 'e' + 10, 't' + 10, 's' + 10, 't' + 10, 'r' + 10, 'i' + 10, 'n' + 10, 'g' + 10};
由于您的秘密字符串可能在RO段中:

char *decode(const unsigned char *str, int c)
{
    int len = 0;
    char *ml, *cl;
    while(*str != abs(c))
        len++;
    ml = malloc(len + 1);
    if(ml != NULL)
    {
        cl = ml;
        while(*str != abs(c))
            *cl++ = *str++ + c;
        *cl = 0;
    }
    return ml;
}
当然,编写脚本为您编写字符串文本更容易。编码机制可能要复杂得多——在这个例子中,我只是一个微不足道的东西

C中的示例编码函数

#define VNAMEMAX 20
#define VVALUEMAX 200

typedef struct
{
    char vname[VNAMEMAX];
    char vvalue[VVALUEMAX];
}VDEF_T;


VDEF_T varialbles[] =
{
    {.vname = "mystring",.vvalue = "Something very secret"},
    {.vname = "secret_var",.vvalue = "Something even more secret" },
    {0,},
};

int code(VDEF_T *v, char *fname, int c)
{
    FILE *fp = fopen(fname, "wt");
    int result = (fp == NULL) * -1;

    if (!result)
    {
        fprintf(fp, "#ifndef _MYSECRET\n#define _MYSECRET\n\n\n");
        while (!result && v->vname[0])
        {
            fprintf(fp, "static unsigned char %s[] = {\n\t\t", v->vname);
            for (int i = 0; i <= strlen(v->vvalue); i++)
            {
                if (fprintf(fp, "0x%02x,", v->vvalue[i] + c) < 0)
                {
                    result = -1;
                    break;
                }
            }
            if (fprintf(fp, "};\n\n") < 0) result = -1;
            v++;
        }
        if(fprintf(fp, "#endif") < 0) result = -1;
        fclose(fp);
    }
    return result;
}

问题到底是什么?这也不象C++代码,为什么C++标签?如果我编译这个代码并运行字符串,而不是编译的二进制文件,它将显示MySuffTrScand。我正在寻找一种隐藏变量的方法。@ pMeim98是完全合法的C++代码,如果你添加了包含。就像添加相同的include是完全合法的C代码一样,对于已编译的二进制文件来说,不再有“变量”之类的东西了。只有寄存器和内存位置。可能二进制文件包含调试信息,允许调试器在寄存器/内存位置和“变量”之间进行转换,但可以去除这些信息;如果不使用“添加调试信息标志”进行编译,则不会被包括在第一位。@PSkocik这很容易理解-当有人浏览uC中的可执行文件或闪存时,他希望对字符串文本进行赋值,使其“不可见”。在我看来,这是100%清楚。我能在一个文件中隐藏字符串吗?示例:static const char*secret=“secret.txt”;是的,你会的。当然,所有字符串都必须按照示例所示进行编码
#ifndef _MYSECRET
#define _MYSECRET


static unsigned char mystring[] = {
        0x5d,0x79,0x77,0x6f,0x7e,0x72,0x73,0x78,0x71,0x2a,0x80,0x6f,0x7c,0x83,0x2a,0x7d,0x6f,0x6d,0x7c,0x6f,0x7e,0x0a,};

static unsigned char secret_var[] = {
        0x5d,0x79,0x77,0x6f,0x7e,0x72,0x73,0x78,0x71,0x2a,0x6f,0x80,0x6f,0x78,0x2a,0x77,0x79,0x7c,0x6f,0x2a,0x7d,0x6f,0x6d,0x7c,0x6f,0x7e,0x0a,};

#endif