如何防止用户读取存储在二进制文件中的字符串?

dai*_*isy 4 c c++ linux string elf

这是一个最小的测试用例:

#include <stdio.h>
#include <stdlib.h>

int main ( int argc , char **argv )
{
        const char abc [15] = "abcdefg\0";
        printf ("%s\n" , abc);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

和你做strings test,你应该看到abcdefg,因为它存储在只读区域.

那么,使用"strings"命令阻止用户读取此字符串的最佳方法是什么,例如我不希望用户知道我的SQL短语

Ant*_*ine 11

一种解决方案是编写另一个以另一个用户身份运行的程序,并从要保护凭据的用户无法访问的位置读取凭据.该程序将公开一个API(通过TCP/IP或任何消息传递接口或远程过程调用),它不需要直接连接到数据库,而只响应您感兴趣的请求.

另一种方法是在程序上设置setuid位,并从用户没有读访问权的位置读取凭据.使用,为程序提供允许读取包含查询的文件的所有者chown.执行时,程序将获得读取文件的权限.

就像Nawaz的答案(和Binyamin Sharet)中说的那样,你可以使用混淆技术来使查询更难(特别是它strings不再适用),但要记住,有更多知识的人能够找到使用反汇编程序或调试程序的字符串,或者只是通过运行程序strace.这使得这种方法不适合存储敏感信息,例如连接凭证:只要二进制文件可以连接,它包含凭证,任何具有计算机安全知识的人都知道并且可以对程序进行反向工程以检索密码.

作为一般准则,如果您需要保护执行程序的用户的信息,请不要将此信息提供给程序.这是确保无法读取的唯一方法.


MBy*_*ByD 5

您可以将字符串与一些常量缓冲区进行异或存储,并在使用过程中恢复原始字符串。虽然不是那么容易维护...

例如,字符串“hello”,与 0x55 异或是:

hello:  0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x00
0x55:   0x55, 0x55, 0x55, 0x55, 0x55, 0x55
result: 0x3D, 0x30, 0x39, 0x39, 0x3A, 0x55
Run Code Online (Sandbox Code Playgroud)

所以我们存储缓冲区:

char enc_str[] = { 0x3D, 0x30, 0x39, 0x39, 0x3A, 0x55 };
Run Code Online (Sandbox Code Playgroud)

这是我们的解密函数(简化版):

#define DEC_STR(X, Y) getDecryptedStr(X, Y sizeof(Y))
void getDecryptedStr(char * dec_str, char * enc_str, size_t size) {
    int i;
    for (i = 0; i < size; ++i) {
        dec_str[i] = enc_str[i] ^ 0x55;
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我们如何使用它:

char clear_str[sizeof(enc_str)];
DEC_STR(clear_str, enc_str);
Run Code Online (Sandbox Code Playgroud)

  • 这就是所谓的*通过默默无闻的安全* (6认同)