我试图弄清楚这个 objdump -d 的所有元素的含义。
例如我有:
08048b50 <phase_1>:
8048b50: 83 ec 1c sub $0x1c,%esp
8048b53: c7 44 24 04 68 a2 04 movl $0x804a268,0x4(%esp)
8048b5a: 08
8048b5b: 8b 44 24 20 mov 0x20(%esp),%eax
8048b5f: 89 04 24 mov %eax,(%esp)
8048b62: e8 63 04 00 00 call 8048fca <strings_not_equal>
8048b67: 85 c0 test %eax,%eax
8048b69: 74 05 je 8048b70 <phase_1+0x20>
8048b6b: e8 f5 06 00 00 call 8049265 <explode_bomb>
8048b70: 83 c4 1c add $0x1c,%esp
8048b73: c3 ret
Run Code Online (Sandbox Code Playgroud)
具体来说,我不确定第一列和中间列告诉我什么
已解决: 解决方案是调用personality(0x40000)。请参阅下面评论中的详细信息。
ASLR 标志位于 ELF 文件中的什么位置?我需要禁用特定库 (.so) 的 ASLR。我尝试过使用 objdump 但不知道如何操作。
我无法使用 /proc,因为它似乎不适用于我的 Android 4.4.4,因此我尝试修改二进制文件。
编辑: 我已经编译了以下内容:
#include <stdio.h>
void* getEIP()
{
return __builtin_return_address(0) - 0x5;
}
int main(int argc, char** argv)
{
printf("EIP located at: %p\n", getEIP());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
没有 ASLR (PIE):
arm-linux-androideabi-gcc.exe code.c -o noPIE --sysroot=%NDK%\platforms\android-3\arch-arm
Run Code Online (Sandbox Code Playgroud)
与ASLR(PIE):
arm-linux-androideabi-gcc.exe -fPIE -pie code.c -o withPIE --sysroot=%NDK%\platforms\android-3\arch-arm
Run Code Online (Sandbox Code Playgroud)
noPIE 二进制文件确实没有被随机化,尽管:
# cat /proc/sys/kernel/randomize_va_space
2
Run Code Online (Sandbox Code Playgroud) 我的脚本崩溃并且调试器无法捕获错误。我什至尝试捕获一些功能,但没有成功。
有什么建议如何缩小问题可能出现的范围吗?
该脚本是游戏的测试脚本。对于以前的游戏来说它效果很好,但是对于新游戏来说有一些新的情况。不幸的是我不知道错误在哪里。可能是当从服务器接收到唯一的案例对象时。
该脚本正在针对服务器进行测试并将输出写入控制台或文件。在这两种情况下都会发生错误。
错误:Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
编辑:
这是SegfaultHandler输出:
PID 2645 received SIGSEGV for address: 0x0
0 segfault-handler.node 0x00000001034ae1c8 _ZL16segfault_handleriP9__siginfoPv + 280
1 libsystem_platform.dylib 0x00007fff9364b52a _sigtramp + 26
2 ??? 0x0000000000000010 0x0 + 16
3 node 0x000000010067bbdc _ZN2v88internal23Runtime_GetFrameDetailsEiPPNS0_6ObjectEPNS0_7IsolateE + 2364
4 ??? 0x00000a107710961b 0x0 + 11065833330203
5 ??? 0x00000a107795c134 0x0 + 11065842057524
我正在尝试在定制的 ARM 板上调试 Android Surfaceflinger 守护程序中的段错误。该进程在转储调用堆栈和寄存器内容(包括程序计数器)之前崩溃。
通常我会使用 objdump 并搜索程序计数器。问题在于调用堆栈的一部分位于共享库中。如果不使用 gdb,我如何将程序计数器与源文件中的一行关联起来?即是否可以在不运行程序的情况下确定共享库指令的地址?
我认为这个问题与其他类似的问题有很大不同。
我的流程大致是这样的:
### Compile
%> gcc -ggdb3 file0.c ... -fno-builtin -c -o file0.o
%> gcc -ggdb3 file1.c ... -fno-builtin -c -o file1.o
...
%> gcc -ggdb3 fileN.c ... -fno-builtin -c -o fileN.o
### Link
%> gcc -ggdb3 -nostdlib -nodefaultlibs -Tscript.lds -Ttext=0x4000000 \
-Wl,--build-id=none -o main.elf file0.o file1.o ... fileN.o
### Disassemble
%> objdump -Stsxd main.elf > main.dis
Run Code Online (Sandbox Code Playgroud)
我没有看到 . 生成的反汇编文件行之间的 C 代码objdump。 请参阅下图的示例。
我不责怪objdump,因为objdump --dwarf=decodedline main.elf什么也没有表现出来。我认为elf 文件中没有这些信息。
-g、-ggdb、 …类似于我如何反汇编原始x86代码?,但是对于MIPS架构而言:我该如何反汇编原始MIPS代码objdump?我想查看vmlinux映像中的说明,但现在我必须这样做:
: > x.c
mipsel-linux-gnu-gcc -c -o x.o x.c
mipsel-linux-gnu-objcopy --add-section raw=vmlinux x.o
mipsel-linux-gnu-objcopy --remove-section .comment x.o
mipsel-linux-gnu-objdump -D x.o | less
Run Code Online (Sandbox Code Playgroud)
有更简单的方法吗?我尝试了以下无济于事:
mipsel-linux-gnu-objdump -b elf32-tradlittlemips -mmips -Mgpr-names=O32,cp0-names=mips1,cp0-names=mips1,hwr-names=mips1,reg-names=mips1 -D vmlinux | less
Run Code Online (Sandbox Code Playgroud)
它只是吐出来:
mipsel-linux-gnu-objdump: vmlinux: File format not recognized
Run Code Online (Sandbox Code Playgroud)
如果有帮助,这是一些命令的输出:
$ file x.o
x.o: ELF 32-bit LSB relocatable, MIPS, MIPS-I version 1 (SYSV), with unknown capability 0xf41 = 0x756e6700, with unknown capability 0x70100 = 0x1040000, not stripped
$ mipsel-linux-gnu-objdump -p x.o
x.o: file format elf32-tradlittlemips
private …Run Code Online (Sandbox Code Playgroud) 我正在读"黑客"这本书.在这本书中有解释使用的部分.dtors和.ctors.
我正在尝试重现本书的一个练习,但在我的可执行文件中,我没有这一部分.起初我认为问题是我正在编译64位,但现在我正在编译32位.dtors并且.ctors仍然没有出现在节表中.这是代码:
#include <stdio.h>
#include <stdlib.h>
static void
miConstructor(void) __attribute__ ((constructor));
static void
miDestructor(void) __attribute__ ((destructor));
int
main(void) {
printf("En main() \n");
return 0;
}
void
miConstructor(void) {
printf("En el constructor\n");
}
void
miDestructor(void) {
printf("En el destructor\n");
}
Run Code Online (Sandbox Code Playgroud)
我正在编译:
gcc -m32 -o a.out dtors_example.c
Run Code Online (Sandbox Code Playgroud)
这是nm的输出:
080495f0 d _DYNAMIC
080496e4 d _GLOBAL_OFFSET_TABLE_
080484dc R _IO_stdin_used
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
080485d8 r __FRAME_END__
080495ec d __JCR_END__
080495ec d __JCR_LIST__
08049704 D …Run Code Online (Sandbox Code Playgroud) 我想生成像这个问题的答案中的组件使用GCC生成可读组件?
对于简单的测试代码:test.c
void main(){
int i;
for(i=0;i<10;i++){
printf("%d\n",i);
}
}
Run Code Online (Sandbox Code Playgroud)
gcc命令: gcc -g test.c -o test.o
objdump命令: objdump -d -M intel -S test.o
但我得到的是程序集以.init部分开头,
080482bc<_init>:以.fini部分结束080484cc<_fini>
我不希望他们出现.
为什么会这样?如何避免显示不在源文件中的部分?
所以基本上我在Linux 32位上编译了一些ELF二进制文件.
我想在我的Mac 64位上分析它.
我正在尝试使用自制软件安装的gnu utils gobjdump和greadelf.
但是,当我尝试使用gobjdump解析elf二进制文件时,我收到此错误:
gobjdump: hello: File format is ambiguous
gobjdump: Matching formats: elf32-i386-nacl elf32-i386-sol2 elf32-i386-vxworks elf32-i386
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
是否有可能使用其gnu工具在MAC上分析32位Linux编译的ELF二进制文件?
如果可能,该怎么办?
我有以下汇编代码:
global _start
section .text
_start:
add byte [eax], al
Run Code Online (Sandbox Code Playgroud)
编译和链接后,我尝试看到操作码:
$ objdump -d eax.o
eax.o: file format elf32-i386
Disassembly of section .text:
00000000 <_start>:
...
$
Run Code Online (Sandbox Code Playgroud)
为什么我得到一个空操作码?
objdump ×10
c ×4
assembly ×3
disassembly ×3
linux ×3
gcc ×2
arm ×1
aslr ×1
c++ ×1
constructor ×1
destructor ×1
elf ×1
javascript ×1
macos ×1
mips ×1
nm ×1
node.js ×1
opcode ×1
random ×1
x86 ×1