标签: objdump

反汇编原始x64机器代码

获取objdump以反汇编原始x64代码的正确架构是什么?你会认为-m x86-64应该通过阅读帮助来工作,但事实并非如此.我尝试了两个cygwin64版本:

$ objdump --version
GNU objdump (GNU Binutils) 2.23.52.20130604
Run Code Online (Sandbox Code Playgroud)

以及我的Fedora 18 x64 install(2.23.51.0.1-3.fc18 20120806)中的版本,但我只能得到can't use supplied machine x86-64.也试过amd64x64,但没有任何工作.

该命令基本上是 objdump -b binary -D -m ??? file

64-bit objdump disassembly

10
推荐指数
1
解决办法
5478
查看次数

Segfault:objdump和gdb之间的反汇编是不同的

[深呼吸.]我们有一个使用WxMotif 2.6.3弹出窗口的应用程序(GUI库不是 - 而不是 - 我的选择).它在32位ix86系统上运行良好.我的任务是将其转换为64位应用程序.它始终是错误的.我在RHEL 6上,所以我使用gcc 4.4.7编译.在咬牙切齿之后,问题显而易见:在wxFrame :: DoCreate中,m_mainWidget被设置(正确); 在wxFrame :: GetMainWidget中,它作为空指针返回.空指针导致崩溃.使用gdb,设置m_mainWidget的指令是

mov    %rax,0x1e0(%rdx) # $rdx = 0x68b2f0
Run Code Online (Sandbox Code Playgroud)

而获取m_mainWidget的代码是

mov    0x1f0(%rax),%rax # $rax = 0x68b2f0
Run Code Online (Sandbox Code Playgroud)

在gdb中,我可以检查内存并看到0x68b4d0处的指针是正确的.为什么偏移不正确?

为了使事情更加混乱,当我使用objdump来反汇编libwx_motifd_core-2.6.so.0.3.1时,"get"程序集是

  mov    0x1e0(%rax),%rax
Run Code Online (Sandbox Code Playgroud)

在objdump中,get和set都使用0x1e0作为偏移量.到底是怎么回事?

我在这里上传了一些相关信息: GitHub

我已经包含了一个小程序,可以在我的系统上复制问题.

进一步研究,我在wxFrame :: DoCreate的反汇编中看到,进一步使用m_mainWidget使用0x1e0作为偏移量检索值(反汇编是在我使用-O0的编译中,所以代码必须返回内存每一次)."Just for Fun",我向wxFrame添加了一个新的成员变量 - m_myMainWidget - 并在设置m_mainWidget后立即设置它.然后我让wxFrame :: GetMainWidget()返回本地值(m_myMainWidget).你不知道吗:崩溃仍然发生,当我从gdb中反汇编时,GetMainWidget包含相同的+16偏移量.(偏移不在那里我使用objdump进行反汇编.)

c++ assembly gdb objdump

10
推荐指数
1
解决办法
584
查看次数

使用Objdump的结果构建控制流图

我正在尝试构建一个通过调用objdump -d返回的汇编结果的控制流图.目前我提出的最好的方法是将结果的每一行放入链表中,并将每行的内存地址,操作码和操作数分开.我依靠objdump结果的常规性质将它们分开(内存地址是字符串2到字符串中代表每一行的字符7).

完成后,我启动实际的CFG指令.CFG中的每个节点都包含一个起始和结束内存地址,一个指向前一个基本块的指针,以及指向任何子基本块的指针.然后我将浏览objdump结果并将操作码与x86_64中所有控制流操作码的数组进行比较.如果操作码是控制流操作码,我将地址记录为基本块的末尾,并根据操作码添加两个子指针(条件操作码)或一个(调用或返回).

我正在用C实现这个过程,看起来它会起作用但感觉非常脆弱.有没有人有任何建议,或者我没有考虑的任何事情?

感谢您抽时间阅读!

编辑:

我的想法是使用它来比较DynamoRIO生成的系统调用的堆栈跟踪与目标二进制文件的预期CFG,我希望像这样构建它会促进这一点.我没有重复使用可用的东西,因为A)我真的没有关于它和B)我需要将图形转换为可用的数据结构,以便我可以进行路径比较.我将看一下您排行的页面上的一些实用程序,感谢您指出我正确的方向.感谢您的评论,我真的很感激!

c assembly x86-64 objdump control-flow-graph

9
推荐指数
1
解决办法
3309
查看次数

什么是.data.rel.ro用于?

我使用objdump来分析共享对象的内存使用情况.与.data和.rodata部分一起,我看到.data.rel.ro部分.

有谁知道这用了什么?

gcc objdump

9
推荐指数
1
解决办法
8032
查看次数

输出objdump -t的输出中".hidden"是什么意思?

例:

$ objdump Logger.cpp.o  -t

00000000 g     F .text  00000000 .hidden __sti___10_Logger_cpp_0b2ae32b
Run Code Online (Sandbox Code Playgroud)

c c++ objdump

9
推荐指数
1
解决办法
3117
查看次数

函数如何存储在内存中?

我一直在深入研究Linux和C,我很好奇函数是如何存储在内存中的.我有以下功能:

void test(){
    printf( "test\n" );
}
Run Code Online (Sandbox Code Playgroud)

很简单.当我在具有此功能的可执行文件上运行objdump时,我得到以下内容:

08048464 <test>:
 8048464:       55                      push   %ebp
 8048465:       89 e5                   mov    %esp,%ebp
 8048467:       83 ec 18                sub    $0x18,%esp
 804846a:       b8 20 86 04 08          mov    $0x8048620,%eax
 804846f:       89 04 24                mov    %eax,(%esp)
 8048472:       e8 11 ff ff ff          call   8048388 <printf@plt>
 8048477:       c9                      leave
 8048478:       c3                      ret
Run Code Online (Sandbox Code Playgroud)

一切看起来都正确.有趣的是,当我运行以下代码时:

int main( void ) {
    char data[20];
    int i;    
    memset( data, 0, sizeof( data ) );
    memcpy( data, test, 20 * sizeof( char ) ); …
Run Code Online (Sandbox Code Playgroud)

c linux memory function objdump

9
推荐指数
2
解决办法
4485
查看次数

objdump和ARM vs Thumb

我正在尝试用gcc反汇编为ARM构建的对象.不幸的是,objdump试图猜测代码是否是ARM和Thumb,并且错了:它认为我的代码是Thumb,而它实际上是ARM.

我看到objdump有一个选项可以强制它将所有指令解释为Thumb(-Mforce-thumb),但它没有强制ARM模式!

这对我来说似乎是一个非常奇怪的遗漏,它严重妨碍了我完成工作的能力(我在嵌入式设备上,我唯一的调试方法是查看反汇编).我尝试了各种方法,包括尝试告诉objdump使用不支持Thumb的ARM架构,但似乎没有任何工作.有任何想法吗?

(是的,我知道指令真的是 ARM ...)

assembly arm objdump binutils thumb

8
推荐指数
2
解决办法
9670
查看次数

从 ARM-GCC 编译的 elf 文件中提取详细的符号信息(结构成员)

我正在使用 ARM-GCC 4.7.4 为 Cortex-M4 编译代码。对于我们的调试工具,我需要有关人类可读格式(例如 .txt)的所有变量的名称、类型和地址的知识。地图文件提供了大部分信息,遗憾的是没有提供如下结构内容:

typedef struct {    float32_t   Ref;        // Input:   Reference Value
            float32_t   Fdb;        // Variable:    Feedback Value
            float32_t   Err;        // Input:   Control Error
            float32_t   Kp;     // Parameter:   Gain of the Proportional Part
            float32_t   Up;         // Output:  Output of Proportional Part
            float32_t   Ki;     // Parameter:   Gain of the Integral Part
            float32_t   Ui;     // Output:  Output of the Integral Part
            float32_t   OutPreSat;  // Output:  Not saturated Output
            float32_t   OutMax;     // Parameter:   Maximum Output
            float32_t   OutMin;     // Parameter: …
Run Code Online (Sandbox Code Playgroud)

debugging gcc arm elf objdump

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

为什么程序级构造函数被`__libc_csu_init`调用而析构函数不被`__libc_csu_fini`调用?

这是一个简单的程序:

void __attribute__ ((constructor)) dumb_constructor(){}

void __attribute__ ((destructor)) dumb_destructor(){}

int main() {}
Run Code Online (Sandbox Code Playgroud)

我用以下标志编译它:

g++ -O0 -fverbose-asm -no-pie -g -o main main.cpp 
Run Code Online (Sandbox Code Playgroud)

我检查与gdb那个__libc_csu_init呼唤我标记瓦特/构造函数:

Breakpoint 1, dumb_constructor () at main.cpp:1
1   void __attribute__ ((constructor)) dumb_constructor(){}
(gdb) bt
#0  dumb_constructor () at main.cpp:1
#1  0x000000000040116d in __libc_csu_init ()
#2  0x00007ffff7abcfb0 in __libc_start_main () from /usr/lib/libc.so.6
#3  0x000000000040104e in _start ()
Run Code Online (Sandbox Code Playgroud)

我认为该destructor属性意味着dumb_destructor()将在 期间调用__libc_csu_fini,但这并没有发生:

Breakpoint 1, dumb_destructor () at main.cpp:3
3   void __attribute__ ((destructor)) dumb_destructor(){} …
Run Code Online (Sandbox Code Playgroud)

c++ assembly gdb libc objdump

8
推荐指数
1
解决办法
577
查看次数

无法从 Rust 代码生成最小的二进制文件

我的目标是将 Rust 程序编译为尽可能小的二进制文件并提取机器代码。我编写了一个非常简单的程序来测试。

.cargo/配置

[target.x86_64-pc-windows-gnu]
rustflags = ["-C", "link-args=-e _start -static -nostartfiles"]
Run Code Online (Sandbox Code Playgroud)

Cargo.toml

[package]
name = "r"
version = "0.1.0"
edition = "2021"

[profile.release]
panic = "abort"
opt-level = "z"
lto = true
codegen-units = 1
Run Code Online (Sandbox Code Playgroud)

主程序.rs

#![no_std]
#![no_main]

#[panic_handler]
fn panic(_: &core::panic::PanicInfo) -> ! {
    loop {}
}

#[no_mangle]
unsafe fn _start() -> isize {
    42
}
Run Code Online (Sandbox Code Playgroud)

我编译cargo build --target x86_64-pc-windows-gnu --release并提取该.text部分objcopy -j .text -O binary target/x86_64-pc-windows-gnu/release/r.exe r.bin,但是当我显示机器代码时,我得到的比我预期的要多:

% objdump -D -b binary …
Run Code Online (Sandbox Code Playgroud)

gcc objdump rust

7
推荐指数
0
解决办法
98
查看次数

标签 统计

objdump ×10

assembly ×4

c ×3

c++ ×3

gcc ×3

arm ×2

gdb ×2

64-bit ×1

binutils ×1

control-flow-graph ×1

debugging ×1

disassembly ×1

elf ×1

function ×1

libc ×1

linux ×1

memory ×1

rust ×1

thumb ×1

x86-64 ×1