在发现几个常用命令(例如read)实际上是 Bash 内置命令(并且在提示符下运行它们时,我实际上正在运行一个两行的 shell 脚本,它只是转发到内置命令),我想看看是否相同对于true和是真的false。
好吧,它们绝对是二进制文件。
sh-4.2$ which true
/usr/bin/true
sh-4.2$ which false
/usr/bin/false
sh-4.2$ file /usr/bin/true
/usr/bin/true: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=2697339d3c19235
06e10af65aa3120b12295277e, stripped
sh-4.2$ file /usr/bin/false
/usr/bin/false: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=b160fa513fcc13
537d7293f05e40444fe5843640, stripped
sh-4.2$
Run Code Online (Sandbox Code Playgroud)
然而,我发现最令人惊讶的是它们的大小。我希望他们只是每一字节数,因为true基本上是exit 0和false是exit 1。
sh-4.2$ true …Run Code Online (Sandbox Code Playgroud) 我最近有一项任务是理解二进制 Linux 程序。但是,该程序是二进制形式的。
我使用了命令file,strings和objdump对它在做什么以及它调用了什么函数有一个初步的了解。
似乎二进制文件是用调试信息编译的。我还能学到什么?
通常对于 arm 系统,设备树向内核 (Linux) 提供硬件信息。这些设备树作为编译并加载到内核的 dts(设备树源)文件存在。问题是我无权访问这样的dts文件,甚至无法访问dtb文件。
我可以访问/sys和/proc在机器上,我想问一下这是否允许我“猜测正确的值”以在 dts 中使用?
如果这个问题的答案还取决于是否首先使用了设备树接口(即 adtb被创建并提供给内核),而不是一些更多的黑客攻击,那么潜在的答案也可以突出另一个方面“我们只是从 vanilla 转移并修补内核以解决我们内核的设备信息问题“-解决方案?
不幸的是我丢失了我的源代码,我只有在 linux 中用 gcc 制作的输出文件,我现在无法访问我的电脑。有什么方法可以将输出文件转换为源文件(在 linux 下的 c 中)?
我需要修改一个脚本,它是我下载的程序的一部分。但是,当我尝试使用 vim 查看脚本时,它充满了随机放置的符号、数字和字母。我能做些什么来阅读这个脚本吗?这是脚本的一部分:
ELF > @ @ J @ 8 @ @ @ @ @ @ À À @ @ @ @ TB TB XB XBa XBa \ ˜† €B €Ba €Ba à à @ @ Påtd „( „(A „(A ´ ´ Qåtd /lib64/ld-linux-x86-64.so.2 GNU % 8 ) # 7 $ . ' " , 1 * 6 5 3 / 2 % - 0
! ( + 4 & ± A ! ® * 9 × ñ « P …Run Code Online (Sandbox Code Playgroud) 我猜想Linux 上的 SQL Server 正在检查/proc/self/status,TracerPID如果不是,则停止运行0。我想测试一下。玩玩,这是 strace,
... lots of stuff
openat(AT_FDCWD, "/proc/self/status", O_RDONLY) = 5
fstat(5, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(5, "Name:\tsqlservr\nUmask:\t0022\nState"..., 1024) = 1024
close(5) = 0
rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [], 8) = 0
getpid() = 28046
gettid() = 28046
tgkill(28046, 28046, SIGABRT) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGABRT {si_signo=SIGABRT, si_code=SI_TKILL, si_pid=28046, si_uid=999} ---
gettid() = 28046
write(2, "Dump collecting thread …Run Code Online (Sandbox Code Playgroud) 我有一个快速的问题。我使用以下代码从 ac 代码生成了一个 ELF 二进制文件:
gcc -o simple simple.c
Run Code Online (Sandbox Code Playgroud)
然后我为那个 ELF 二进制文件做 objdump:
objdump --disassemble-all simple
Run Code Online (Sandbox Code Playgroud)
我已经检查了我的目录ls -a,那里没有 .o 文件。我的问题仍然是如何objdump向我展示完整的反汇编代码?是否objdump在二进制文件中进行静态分析以覆盖所有代码?
我有一个可执行文件,它不能像往常/预期的那样很好地进行反汇编或反编译。
file并ldd给出与通常不同的输出:
$ file exe_file
exe_file: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), statically linked, stripped
$ ldd exe_file
not a dynamic executable
Run Code Online (Sandbox Code Playgroud)
strings 还提示某些事情已关闭:
$strings exe_file
UPX!
.....
PROT_EXEC|PROT_WRITE failed.
$Info: This file is packed with the UPX executable packer http://upx.sf.net $
$Id: UPX 3.91 Copyright (C) 1996-2013 the UPX Team. All Rights Reserved. $
Run Code Online (Sandbox Code Playgroud)
还:
$ ls -la exe_file
-rwxr-xr-x 1 root root 59896 Jan 22 15:26 exe_file
Run Code Online (Sandbox Code Playgroud)
怎么了?
linux ×5
arm ×1
bash ×1
c ×1
device-tree ×1
elf ×1
linux-kernel ×1
ltrace ×1
proc ×1
process ×1
scripting ×1
source-code ×1
sqlserver ×1
strace ×1