gpt4 book ai didi

debugging - gdb - 如何反汇编包括循环在内的整个函数

转载 作者:行者123 更新时间:2023-12-03 23:05:57 25 4
gpt4 key购买 nike

说明:
我正在使用 GDB 来反汇编我自己编写的使用 NASM 组装的 ELF64 可执行文件。
当我尝试使用 disassemble main 进行反汇编时,我只得到以下输出:

Dump of assembler code for function main:
0x0000000000401110 <+0>: mov rbp,rsp
0x0000000000401113 <+3>: mov ebx,0x400
End of assembler dump.
GDB 显然只给了我前两行,即循环之前的那几行,其开始用 .loop_clear 表示。开始。
当我尝试指定像 disassemble 0x0000000000401116, 0x0000000000401119 这样的行时,我得到以下输出:
0x0000000000401116 <main+6>: add    BYTE PTR [rax],al
0x0000000000401118 <main.loop_clear+0>: cmp rbx,0x0
可以看出,有些行没有显示在第一个转储中。
在接下来的尝试中,我尝试明确反汇编 main.loop_clear调用 disassemble main.loop_clear但我留下了 Attempt to extract a component of a value that is not a structure.显然我使用的命令或语法是错误的,但我在研究过程中找不到有用的信息来解决这个问题。
问题:
因此我的问题是:如果正在反汇编的函数包含标签/循环,如何创建反汇编可执行文件的完整且连贯的转储?
此外,是否可以自行拆卸循环?
来源:
global main

section .text
main:

;initialize base pointer (rbp)
mov rbp, rsp

;set stack frame size and clear
mov rbx, 0x400
.loop_clear:
cmp rbx, 0x0
je .exit_clear
mov byte [rsp], 0x0
dec rsp
dec rbx
jmp .loop_clear
.exit_clear:

;prepare array index pointer
mov rcx, rsp

;transpiled brainfuck source
mov bl, [rcx]
add bl, 65
mov [rcx], bl
mov rsi, rcx
mov rdx, 0x1
mov rdi, 0x1
mov rax, 0x1
syscall ; write(fd=1, buf, size=1 byte)

;exit gracefully
mov rax, 0x3
mov rdi, 0x0
syscall ; close(0)
ret

最佳答案

您可以通过删除本地标签来解决此问题(但会损失一些可调试性):

$ nasm -f elf64 foo.asm && nm foo.o
0000000000000000 T main
000000000000001a t main.exit_clear
0000000000000008 t main.loop_clear

$ strip --strip-unneeded foo.o && nm foo.o
0000000000000000 T main
gdb -q --batch -ex 'disas main' foo.o

Dump of assembler code for function main:
0x0000000000000000 <+0>: mov %rsp,%rbp
0x0000000000000003 <+3>: mov $0x400,%ebx
0x0000000000000008 <+8>: cmp $0x0,%rbx
0x000000000000000c <+12>: je 0x1a <main+26>
0x000000000000000e <+14>: movb $0x0,(%rsp)
0x0000000000000012 <+18>: dec %rsp
0x0000000000000015 <+21>: dec %rbx
0x0000000000000018 <+24>: jmp 0x8 <main+8>
0x000000000000001a <+26>: mov %rsp,%rcx
0x000000000000001d <+29>: mov (%rcx),%bl
0x000000000000001f <+31>: add $0x41,%bl
0x0000000000000022 <+34>: mov %bl,(%rcx)
0x0000000000000024 <+36>: mov %rcx,%rsi
0x0000000000000027 <+39>: mov $0x1,%edx
0x000000000000002c <+44>: mov $0x1,%edi
0x0000000000000031 <+49>: mov $0x1,%eax
0x0000000000000036 <+54>: syscall
0x0000000000000038 <+56>: mov $0x3,%eax
0x000000000000003d <+61>: mov $0x0,%edi
0x0000000000000042 <+66>: syscall
0x0000000000000044 <+68>: retq
End of assembler dump.
或者你可以单引号 main.loop_clear在 GDB disas命令。

关于debugging - gdb - 如何反汇编包括循环在内的整个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62694107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com