标签: objdump

试图组装反汇编程序的输出(例如objdump)

可能重复:
反汇编,修改然后重新组装Linux可执行文件

我被告知装配和拆卸不是反转.显然,你不能解组程序,将输出直接放入汇编程序,并期望它能够正确运行,因为信息丢失了.

我的问题是,为什么信息会丢失?还有什么信息丢失了?

assembly objdump

3
推荐指数
1
解决办法
2253
查看次数

objdump将文本段的内容提取为二进制格式

我们如何使用objdump输出到二进制文件?

这绝对不是正确的方法:

objdump -s -j .text /path/firmware.ko > /content.bin

因为它只呈现文本格式.我只需要提取文本段的字节并以二进制形式设置.

linux objdump

3
推荐指数
2
解决办法
1万
查看次数

组装远调用或远跳转(j* 指令)

我正在尝试创建一个调度表,该表更改由AllocateMemoryOnRemoteProcess.

其中的一个问题,我遇到的是几乎所有的Calls都挺Jumpsnearrelative和,只要我加载新的位置的组件,然后这些指令将无法正常工作。

据我所知,我应该将这些说明转换为far jumpfar call我在谷歌搜索期间看到的解决方案之一正在使用pushret喜欢:

push 0xdeadbeef
ret
Run Code Online (Sandbox Code Playgroud)

或者有人建议使用寄存器进行绝对寻址,例如:

mov %eax,0xdeadbeef
jmp %eax
Run Code Online (Sandbox Code Playgroud)

这些解决方案在我的情况下不起作用,因为只要我在函数例程中,更改堆栈状态或在第二种情况下更改寄存器%eax就会导致失败。

有人在这个问题中写道:

  • call far(使用操作码 9A)跳转到一个绝对段和偏移量。即,这就像一次设置 CS 和 ?IP。

所以看来我应该将操作码与9Afor一起使用far calls,但这仅适用于调用,我不知道使用此方法转换各种跳转!

我经常objdump用来反汇编二进制文件,然后使用clang以下命令用作汇编程序:

clang -c MyAsm.asm -m32
Run Code Online (Sandbox Code Playgroud)

但是当我用上面的命令组装时,结果是相对的。

例如什么时候MyAsm.asm是:

call   0x402af2
Run Code Online (Sandbox Code Playgroud)

结果objdump是:

    MyAsm.o:    file format Mach-O 32-bit i386

Disassembly of section __TEXT,__text:
__text:
       0:   e8 …
Run Code Online (Sandbox Code Playgroud)

x86 assembly x86-64 clang objdump

3
推荐指数
1
解决办法
1912
查看次数

riscv objdump 如何设置打印 x0-x31 寄存器名称而不是 abi 名称

我正在尝试使用 riscv64-unknown-elf-objdump 反汇编 risc-v 二进制文件,并且我想获取硬件中看到的寄存器名称(如 x0-x31),而不是像 abi 中那样(sp、s0、a. .)。

objdump手册似乎没有针对RISC-V的这样的选项。事实上,手册中似乎没有任何与RISC-V相关的信息。ARM 有 -M reg-names-raw,有谁知道这样的标志是否可用?

riscv64-unknown-elf-objdump -M"no-aliases" -M"gpr-names-raw" -d hello -> 返回
0: riscv64-unknown-elf-objdump: 无法识别的反汇编程序选项: gpr-names-raw gpr-names-raw 或 reg-names=ARCH 都不是可识别的选项

我想要这样的东西:

addi    x1,x1,-32
sw      x2,28(x3)
addi    x5,x5,32
Run Code Online (Sandbox Code Playgroud)

而不是这个

addi    sp,sp,-32
sw      s0,28(sp)
addi    s0,sp,32
Run Code Online (Sandbox Code Playgroud)

assembly cpu-registers objdump disassembly riscv

3
推荐指数
1
解决办法
1003
查看次数

为什么 mov %ax, %ds 汇编+反汇编为 mov %eax,%ds,与原来不一致?

测试.S

.text
.global _start
    _start:
        xor %ax, %ax
        mov %ax, %ds
        mov %ax, %ss
        mov %ax, %es
        mov %ax, %fs
        mov %ax, %gs
Run Code Online (Sandbox Code Playgroud)

我通过这样做得到了反汇编代码文件

$ x86_64-elf-gcc -g -c -O0 -m32 -fno-pie -fno-stack-protector -fno-asynchronous-unwind-tables .\test.S
$ x86_64-elf-ld .\test.o -m elf_i386  -Ttext=0x7c00 -o test.elf
$ x86_64-elf-objdump -x -d -S -m i386 ./test.elf > test_dis.txt
Run Code Online (Sandbox Code Playgroud)

测试_dis.txt


./test.elf:     file format elf32-i386
./test.elf
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x00007c00

Program Header:
    LOAD off    0x00000000 vaddr 0x00007000 paddr 0x00007000 align 2**12
         filesz …
Run Code Online (Sandbox Code Playgroud)

x86 assembly gnu-assembler objdump memory-segmentation

3
推荐指数
1
解决办法
162
查看次数

"-0x1(%edx,%ecx,1)"在objdump输出中是什么意思?

使用objdump来理解二进制文件,我意识到我在ASM语法方面不够流畅.以下概念意味着什么?

xor    %al,-0x1(%edx,%ecx,1)
Run Code Online (Sandbox Code Playgroud)

当你在它的时候 - 我应该搜索什么才能找到关于这些概念的文档?

assembly objdump

2
推荐指数
1
解决办法
898
查看次数

在cygwin上找不到objdump

我想在cygwin上使用objdump命令.我得到了例外:

-bash:objdump:找不到命令

为什么cygwin无法找到objdump?

编辑----我可以在http://cygwin.com/packages/上看到binutils .一旦我找到binutils包,我点击它就会把我带到这里.我该如何安装?我到那儿后该怎么办?

cygwin elf objdump dwarf

2
推荐指数
1
解决办法
4483
查看次数

我可以将"Objdump -S -d elf-file"生成的所有部分组合成一个具有重新组装功能的文件吗?

elf文件是静态链接的

目前objdump的输出是这样的:

Disassembly of section: .init:

xxxxxx

Disassembly of section: .plt:

xxxxxx

Disassembly of section: .text:

xxxxxx
Run Code Online (Sandbox Code Playgroud)

基本上我想要实现的是

"elf-file - (通过objdump反汇编) - >汇编文件 - (重新编译) - > 相同的功能 "

我不需要重新编译的二进制文件具有与原始二进制文件相同的二进制内容,只有相同的功能就足够了.

经过快速搜索,基本上答案是否定的,他们认为反汇编文件丢失了一些像符号信息或其他东西,但我认为通过静态链接,我可以摆脱这个问题......

谢谢!

assembly reverse-engineering elf objdump disassembly

2
推荐指数
1
解决办法
1703
查看次数

使用gdb和objdump进行调试

我有很多关于gdb和objdump的问题.

objdump中的地址

如果我这样做:objdump -d binary-file-name,那么我得到包含这部分的输出:

Disassembly of section .text:

080484a0 <_start>:
 80484a0:   31 ed                   xor    %ebp,%ebp
 80484a2:   5e                      pop    %esi
 80484a3:   89 e1                   mov    %esp,%ecx
Run Code Online (Sandbox Code Playgroud)

我假设第一列中的这些数字是地址?但是我不明白这些地址是如何知道的,因为当一个进程被加载时它被放在内存中的一个随机位置,这意味着代码每次都有不同的地址?或者这些地址是相对于进程'地址空间?

<_start>下列出的值是什么?

GDB逐步执行代码

我有一个二进制文件,其中没有源代码.我想逐步完成该程序,但没有符号信息.我无法在功能名称或亚麻布上设置断点.我试图在地址上设置一个断点,这很有效,但我无法弄清楚如何逐步完成该程序.当我这样做:(gdb)s或(gdb)n它说它没有行信息,只运行整个函数.有没有办法逐步完成它,或逐步完成装配说明?

assembly gdb objdump memory-address

2
推荐指数
1
解决办法
7746
查看次数

为什么objdump的汇编编码不同?

我正在阅读有关位置独立代码的文章,并且遇到了此函数的汇编清单。

0000043c <ml_func>:
 43c:   55                      push   ebp
 43d:   89 e5                   mov    ebp,esp
 43f:   e8 16 00 00 00          call   45a <__i686.get_pc_thunk.cx>
 444:   81 c1 b0 1b 00 00       add    ecx,0x1bb0
 44a:   8b 81 f0 ff ff ff       mov    eax,DWORD PTR [ecx-0x10]
 450:   8b 00                   mov    eax,DWORD PTR [eax]
 452:   03 45 08                add    eax,DWORD PTR [ebp+0x8]
 455:   03 45 0c                add    eax,DWORD PTR [ebp+0xc]
 458:   5d                      pop    ebp
 459:   c3                      ret

0000045a <__i686.get_pc_thunk.cx>:
 45a:   8b 0c 24                mov …
Run Code Online (Sandbox Code Playgroud)

x86 assembly gcc objdump intel-syntax

2
推荐指数
1
解决办法
55
查看次数