c - ELF 文件中的字符串是如何编码的?

标签 c string elf

我想证明明文密码很容易从程序中读取:

#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
    char password[] = "a big refreshing lemonade";
    return strcmp(argv[1], password);
}

但它并没有像预期的那样工作:

$ gcc foo.c
$ hexdump -C a.out | grep -C2 'lem'
000006c0  00 00 00 48 89 45 f8 31  c0 48 b8 61 20 62 69 67  |...H.E.1.H.a big|
000006d0  20 72 65 48 ba 66 72 65  73 68 69 6e 67 48 89 45  | reH.freshingH.E|
000006e0  d0 48 89 55 d8 48 b8 20  6c 65 6d 6f 6e 61 64 48  |.H.U.H. lemonadH|
000006f0  89 45 e0 66 c7 45 e8 65  00 48 8b 45 c0 48 83 c0  |.E.f.E.e.H.E.H..|
00000700  08 48 8b 00 48 8d 55 d0  48 89 d6 48 89 c7 e8 6d  |.H..H.U.H..H...m|

我注意到一些奇怪的字符。这是为什么?

最佳答案

这是因为字符串没有被存储为静态数据。

例如,如果你有这个:

const char* password = "a big refreshing lemonade";

甚至这样:

static char password[] = "a big refreshing lemonade";

它连续存储在常量部分的二进制文件中(您会看到彼此相邻的“一大杯提神柠檬水”)。

如果您查看程序集输出,您会看到:

 6:test.c        ****     char password[] = "a big refreshing lemonade";
23                            .loc 1 6 0
24 001e 48B86120              movabsq $7309940773697495137, %rax
24      62696720
24      7265
25 0028 48BA6672              movabsq $7453010330678293094, %rdx
25      65736869
25      6E67
26 0032 488945D0              movq    %rax, -48(%rbp)
27 0036 488955D8              movq    %rdx, -40(%rbp)
28 003a 48B8206C              movabsq $7233183901389515808, %rax
28      656D6F6E
28      6164
29 0044 488945E0              movq    %rax, -32(%rbp)
30 0048 66C745E8              movw    $101, -24(%rbp)
30      6500

你看到很多movabsq的地方,它加载了一个64位常量。所以,它的作用是一次将 8 个字节加载到 password 中。

您会注意到第一个常量 (7309940773697495137) 是“a big re”的小端形式

关于c - ELF 文件中的字符串是如何编码的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57115452/

相关文章:

linux - 如何从文件中确定优化级别?

c - 如何构建和部署 Linux 驱动程序?

c - 信息 C5012 : loop not parallelized due to reason '1008'

ios - 匹配字符串模式,包括 Swift 中的变量部分

string - 如何获取字符串中的行数?

linux - 共享对象中的文本重定位?

c - 堆、栈、文本等不同段与物理内存有何关系?

c - 双 "for"循环中的 fgets 和 strtok

c++ - 用于计算文件中字符串数量的预处理器

c - 当反向字符串的函数返回地址时,我无法打印元素