例如:
int main(int argc, char *argv[]) {
if (strncmp(argv[1], "password")) {
printf("Incorrect password\n");
}
return 0;
}
我可以反汇编这个编译程序的二进制文件,并在二进制文件中的某处看到字符串“password”,或者它只在运行时可见吗?
答案 0 :(得分:4)
通常,是的。而且,你不需要“拆解”任何东西。大多数情况下,您可以通过在文本或十六进制编辑器中打开它来在编译的二进制文件中看到它。
答案 1 :(得分:1)
ASCII字符串不经过任何特殊的编码/解码,因此它们在字面上显示在二进制文件中,并且在二进制文件被解释为(主要是看起来像垃圾的)ASCII文件时会出现。如果你更深入地考虑它,将它们存储在二进制文件中的唯一系统替代方案是所有程序的所有字符串的一些可怕的操作系统范围的中央注册表。如果它们存储在单独的文件中,它们可以与二进制文件分开。
然而,OP似乎提出了一个更大的问题,关于代码布局以及编译对只读数据(如字符串)的作用。一种更有教育意义的方式来找到'该字符串用于查看人类可读汇编的中间编译阶段,其中字符串将被布局并由标签引用。然后,链接器(下一个编译阶段)将标签解析为二进制开头的数字偏移量。请注意下面的.rodata
("只读数据部分")标签。
来自gcc手册页: -S在编译阶段之后停止;不要组装。对于指定的每个非汇编器输入文件,输出采用汇编程序代码文件的形式。
结果:
.file "foo.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "password"
.LC1:
.string "Incorrect password"
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
[汇编语言说明如下]