【问题标题】:Unable to disasembly my app -- no debugging information found无法反汇编我的应用程序 - 未找到调试信息
【发布时间】:2017-10-18 03:46:43
【问题描述】:

我正在尝试反汇编以汇编语言编写的应用程序。我在 Linux,x64:

$ objdump -d my_app 

my_app:     file format elf64-x86-64

就是这样。它出什么问题了?这不是几行简单的hello world,而是大约 200 行代码。

gbd 也一样:

$ gdb -q my_app 
Reading symbols from my_app...(no debugging symbols found)...done.
(gdb) 

$ radare2 my_app 
Warning: Cannot initialize section headers
Warning: Cannot initialize strings table
Warning: Cannot initialize dynamic strings
Warning: Cannot initialize dynamic section
 -- Calculate checksums for the current block with the commands starting with '#' (#md5, #crc32, #all, ..)

更新

$ objdump -D my_app 

my_app:     file format elf64-x86-64

编译:

   $ fasm my_app.asm 
   # => my_app 

更新2:

; simplified

format ELF64 executable 3

include "import64.inc"
interpreter "/lib64/ld-linux-x86-64.so.2"
needed "libc.so.6"
import printf, close

segment readable
    A equ 123
    B equ 222
    C equ 333

segment readable writeable
    struc s1 a, b, c {
      .a1 dw a
      .b1 dw b
      .c dd c
    }

    msg:
        .m1 db "aaa", 0
        .m2 db "bbb", 0
        .m3 db "ccc", 0

segment readable executable
entry $
    mov rax, 2
    mov rdi, "something.txt"
    mov rsi, 0
    syscall

    ; .............
    ; omitted

【问题讨论】:

  • 你试过objdump -D来反汇编所有部分吗?甚至ndisasm 将整个文件反汇编,就好像它是一个平面二进制文件一样。 (默认模式是 16 位,所以设置为 64 位)。
  • 您是否尝试过使用简单的 fasm 程序并以相同的方式构建它以查看会发生什么?
  • @MichaelPetch 同样的事情
  • 我会说你的程序集文件有问题,它正在生成一个不寻常的 ELF 文件(那些似乎没有部分的文件?)。你会幽默我们并张贴所有 200 行吗?或者将程序集文件减少到最小的ins集,一旦组装成可执行文件,仍然会重现相同的行为
  • @jww 他正在使用 fasm,所以甚至可能没有链接阶段(fasm 通常允许您使用一个命令从汇编代码转到可执行文件)

标签: linux assembly fasm


【解决方案1】:

要求fasm 在不使用链接器的情况下直接生成 ELF 二进制文件只会在输出中创建段而不是段。这混淆了一些工具。特别是 objdump -d 被专门记录为对部分进行操作。请注意,gdb 仍然可以调试和反汇编它,如果你给它一些地址,例如入口点。

【讨论】:

  • > 注意 gdb 仍然可以调试和反汇编它,如果你给它一些地址,例如入口点。
  • @Uji 你可以滥用gdb 的“任何失败时中断”机制。使用file 加载它,然后在无效地址上设置断点,如零b *0,然后run ... gdb 将在第一条指令处中断,因为断点无效。删除它d 1(如果添加了“断点1”),因为在这里你可以stepi/etc...
  • @Uji 和 Ped7g:您也可以readelf -a 并查看“入口点”地址。 (不过,b *0 技巧非常方便,也适用于带有 ASLR 的 PIE。)
  • @PeterCordes readefl 说“入口点地址:0x40394a”,该怎么办?
  • @PeterCordes 它仍然让我感到惊讶,没有简单的方法可以直接从 gdb 执行此操作,必须使用其他一些工具。再说一次,gdb 是一种类似于 shell 的工具,就像旧的 ftp,所以也许有办法从内部运行外部命令?我不在乎,使用b *0 对我来说是完美的,我不会像其他任何事情一样容易忘记这一点(readelf 完全超出了我的记忆范围)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多