标签: objdump

全局变量是如何存储在内存中的?

我的代码如下:

#include <stdio.h>
int g_a;
int g_b;
int g_c;

int main()
{
    printf("Hello world\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

并用 gcc 构建它

gcc -o global global.c
Run Code Online (Sandbox Code Playgroud)

最后,我使用 objdump 查看全局变量的地址

objdump -t global
Run Code Online (Sandbox Code Playgroud)

并查看结果:

00004020 g_b
00004024 g_a
00004028 g_c
Run Code Online (Sandbox Code Playgroud)

为什么全局变量存储在像上面这样的地址中?我的意思是全局变量应该按 g_a、g_b、g_c 的顺序存储

c global-variables objdump

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

如何打印 iOS 二进制文件中所有 Objective-C 类的名称?

我想使用"otool""objdump"打印在 iOS 二进制文件中找到的所有 Objective-C 类的名称。我在 macOS 上的未加密的 iOS 二进制文件上执行此操作。

我尝试过的:

  1. 这里建议的解决方案如何静态转储 Cocoa 应用程序中调用的所有 ObjC 方法?
otool -oV /path to executable/ | grep name | awk '{print $3}'
Run Code Online (Sandbox Code Playgroud)

但我不知道如何只解析 Objective-C 类名。

  1. 使用“nm”的解决方案,但我不太喜欢它:
nm /path to executable/ | grep _OBJC_CLASS_
Run Code Online (Sandbox Code Playgroud)

你们能帮我用 cmd/脚本来打印 iOS 二进制文件中所有 Objective-C 类的名称吗?

mach-o objective-c otool objdump

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

如何在 C 语言中在运行时访问解释器路径地址?

通过使用该命令,我发现内存中的objdump地址包含 start the path ,并且由于 C 标准,该路径以一个字节结束。0x02a8/lib64/ld-linux-x86-64.so.20x00

因此,我尝试编写一个简单的 C 程序来打印这一行(我使用了 Denis Yurichev 所著的《RE for Beginners》一书中的示例 - 第 24 页):

#include <stdio.h>

int main(){
    printf(0x02a8);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但我很失望地得到了分段错误而不是预期的/lib64/ld-linux-x86-64.so.2输出。

我发现使用这样一个printf不带说明符或至少不带指针转换的“快速”调用很奇怪,所以我尝试使代码更自然:

#include <stdio.h>

int main(){
    char *p = (char*)0x02a8;
    printf(p);
    printf("\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行后我仍然遇到分段错误。

我不相信这是因为内存区域受限而发生的,因为在书中,第一次尝试一切都很顺利。我不确定,也许还有那本书中没有提到的事情。

因此,需要一些清晰的解释来解释为什么每次我尝试运行程序时都会发生分段错误。

我正在使用最新的完全升级的 Kali Linux 版本。

c memory-management elf objdump memory-address

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

为什么 lea 将明显随机的地址移动到 rdi?

我有以下一段C代码:

#include <stdio.h>

int main()
{
    int i;
    for(i=0; i<10; i++)
        puts("hello, friend");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我这样编译的:gcc firstprog.c -o firstprog

然后,当使用gdb拆卸它时,我看到:

(gdb) disassemble 
Dump of assembler code for function main:
=> 0x0000555555555149 <+0>: endbr64 
   0x000055555555514d <+4>: push   rbp
   0x000055555555514e <+5>: mov    rbp,rsp
   0x0000555555555151 <+8>: sub    rsp,0x10
   0x0000555555555155 <+12>:    mov    DWORD PTR [rbp-0x4],0x0
   0x000055555555515c <+19>:    jmp    0x55555555516e <main+37>
   0x000055555555515e <+21>:    lea    rdi,[rip+0xe9f]        # 0x555555556004
   0x0000555555555165 <+28>:    call   0x555555555050 <puts@plt>
   0x000055555555516a <+33>:    add    DWORD PTR [rbp-0x4],0x1
   0x000055555555516e <+37>:    cmp …
Run Code Online (Sandbox Code Playgroud)

assembly x86-64 objdump string-literals

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

有没有办法使用 pwn 工具来查找可执行文件中函数的地址?

假设我有一个简单的可执行文件,我想找到 main 的地址。通常,我从输出中获取地址objdump,然后在pwn脚本中使用它。我想让我的脚本更加通用,而不使用objdump. 有什么办法可以用 pwn 做到这一点吗?

objdump pwntools

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

riscv objdump -d 的输出不清楚

现在我正在尝试了解 RISC-V ISA,但我对机器代码和汇编有不清楚的地方。

我写了这样的C代码:

int main() {
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

然后,我通过以下命令生成了 .s 文件:

$ /opt/riscv/bin/riscv64-unknown-linux-gnu-gcc -S 42.c

输出是:

        .file   "42.c"
        .option nopic
        .text
        .align  1
        .globl  main
        .type   main, @function
main:
        addi    sp,sp,-16
        sd      s0,8(sp)
        addi    s0,sp,16
        li      a5,42
        mv      a0,a5
        ld      s0,8(sp)
        addi    sp,sp,16
        jr      ra
        .size   main, .-main
        .ident  "GCC: (g5964b5cd727) 11.1.0"
        .section        .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)

现在,我运行以下命令来生成一个精灵。

$ /opt/riscv/bin/riscv64-unknown-linux-gnu-gcc -nostdlib -o 42 42.s

这样,就生成了一个二进制文件。我尝试通过 objdump 读取该内容,如下所示:

$ /opt/riscv/bin/riscv64-unknown-linux-gnu-objdump -d 42

所以输出是这样的:


42:     file format elf64-littleriscv


Disassembly of section .text:

00000000000100b0 …
Run Code Online (Sandbox Code Playgroud)

linux assembly elf objdump riscv

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

xtensa dissembly 中的大括号

我正在反汇编和检查(主要是为了乐趣和学习)为 ESP8266 (Xtensa ISA) 生成的 Arduino 代码。

到目前为止,我一直在跟踪代码,没有出现任何问题,直到4010f4c2主函数中的大括号(位置):

4010f494 <main>:
4010f494:   90a092                  movi    a9, 144
4010f497:   c01190                  sub a1, a1, a9
4010f49a:   00a022                  movi    a2, 0
4010f49d:   236102                  s32i    a0, a1, 140
4010f4a0:   2261c2                  s32i    a12, a1, 136
4010f4a3:   2161d2                  s32i    a13, a1, 132
4010f4a6:   ffc2c5                  call0   4010f0d4 <print_version>
4010f4a9:   202110                  or  a2, a1, a1
4010f4ac:   001045                  call0   4010f5b4 <eboot_command_read>
4010f4af:   00d256                  bnez    a2, 4010f4c0 <main+0x2c>
4010f4b2:   024c                    movi.n  a2, 64
4010f4b4:   fee101                  l32r    a0, 4010f038 <_stext+0x38>
4010f4b7: …
Run Code Online (Sandbox Code Playgroud)

assembly arduino objdump esp8266 xtensa

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