C ELF文件中的字符串是如何编码的?
我想证明clear中的密码很容易从程序中读取: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
#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