Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C ELF文件中的字符串是如何编码的?_C_String_Elf - Fatal编程技术网

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

C ELF文件中的字符串是如何编码的?,c,string,elf,C,String,Elf,我想证明clear中的密码很容易从程序中读取: #include <stdio.h> #include <string.h> int main(int argc, char** argv) { char password[] = "a big refreshing lemonade"; return strcmp(argv[1], password); } 我注意到一些奇怪的人物。为什么会这样?这是因为字符串不是作为静态数据存储的 例如,如果您有: c

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

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

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

我注意到一些奇怪的人物。为什么会这样?

这是因为字符串不是作为静态数据存储的

例如,如果您有:

const char*password=“一大杯提神柠檬水”;
甚至这个:

static char password[]=“一大杯提神柠檬水”;
它被连续地存储在常量部分的二进制文件中(您可以看到“一个大的提神柠檬水”挨着一个)

如果查看部件输出,您会看到:

 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个字节加载到
密码中

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

我想证明在clear中的密码很容易从程序中读取

人们可以很容易地使用,找到这些信息

字符串-打印文件中可打印字符的字符串

根据你的例子

字符串a.out
[…被截断的…]
一个大的
刷新
柠檬水
[…被截断的…]
全部输出

字符串a.out
/lib64/ld-linux-x86-64.so.2
libc.so.6
__堆栈_chk_失败
__cxa_最终确定
字符串比较函数
__libc_启动_main
GLIBC_2.2.5
GLIBC_2.4
_ITM_可撤销注册
__gmon_启动__
_ITM_寄存器MClonetable
一个大的
刷新
柠檬水
阿瓦维
奥特
[]A\A]A^A_
;*3$"
GCC:(Ubuntu 7.4.0-1ubuntu1~18.04.1)7.4.0
crtstuff.c
注销克隆
__你是全球的吗
已完成。7697
__是否执行全局数据项辅助完成数组项
虚拟帧
__帧\伪\初始化\数组\项
富科
__框架U端__
__初始化数组结束
_动态的
__初始化数组开始
__GNU_EH_帧HDR
_全局偏移量表_
__libc_csu_fini
_ITM_可撤销注册
_伊达塔
__堆栈\u chk\u失败@@GLIBC\u 2.4
__libc_start_main@@GLIBC_2.2.5
__数据启动
strcmp@@GLIBC_2.2.5
__gmon_启动__
__dso_手柄
_用过的
__libc_csu_init
__bss_开始
主要的
__TMC_端__
_ITM_寄存器MClonetable
__cxa_finalize@@GLIBC_2.2.5
.symtab
.strtab
shstrtab先生
.interp
.note.ABI-tag
.note.gnu.build-id
.gnu.hash
dynsym先生
戴恩斯特先生
.gnu.version
.gnu.version\r
雷拉·戴恩先生
.rela.plt
.init
.plt.got
.文本
菲尼先生
罗达先生
.eh_frame_hdr
.eh_框架
.init_数组
.fini_数组
动态
.数据
.bss
.评论
root@42d62eac5ccf:~#
root@42d62eac5ccf:~#字符串a
/lib64/ld-linux-x86-64.so.2
libc.so.6
__堆栈_chk_失败
__cxa_最终确定
字符串比较函数
__libc_启动_main
GLIBC_2.2.5
GLIBC_2.4
_ITM_可撤销注册
__gmon_启动__
_ITM_寄存器MClonetable
一个大的
刷新
柠檬水
阿瓦维
奥特
[]A\A]A^A_
;*3$"
GCC:(Ubuntu 7.4.0-1ubuntu1~18.04.1)7.4.0
crtstuff.c
注销克隆
__你是全球的吗
已完成。7697
__是否执行全局数据项辅助完成数组项
虚拟帧
__帧\伪\初始化\数组\项
富科
__框架U端__
__初始化数组结束
_动态的
__初始化数组开始
__GNU_EH_帧HDR
_全局偏移量表_
__libc_csu_fini
_ITM_可撤销注册
_伊达塔
__堆栈\u chk\u失败@@GLIBC\u 2.4
__libc_start_main@@GLIBC_2.2.5
__数据启动
strcmp@@GLIBC_2.2.5
__gmon_启动__
__dso_手柄
_用过的
__libc_csu_init
__bss_开始
主要的
__TMC_端__
_ITM_寄存器MClonetable
__cxa_finalize@@GLIBC_2.2.5
.symtab
.strtab
shstrtab先生
.interp
.note.ABI-tag
.note.gnu.build-id
.gnu.hash
dynsym先生
戴恩斯特先生
.gnu.version
.gnu.version\r
雷拉·戴恩先生
.rela.plt
.init
.plt.got
.文本
菲尼先生
罗达先生
.eh_frame_hdr
.eh_框架
.init_数组
.fini_数组
动态
.数据
.bss
.评论

这是您的文本(IDE)编辑器编码的内容。您可能看不到显式字符串,因为您的代码实际上没有引用字符串文字。您的
char password[]
main()
的一个局部变量,它用值
初始化为“一大杯清新柠檬水”
。这并不意味着可执行文件中必须存在字符串literal
“一大杯提神柠檬水”
——所要做的就是正确初始化数组。将
char password[]
更改为
char*password
,您很可能会看到一些不同的内容。@AndrewHenle或not。novox:
字符串
可能只是一条注释。字符串在hextump中也同样可读。
 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