簡體   English   中英

如何在 Linux 上從頭開始拆解?

[英]How to walk through disassembly from the beginning on Linux?

   │0x565554fd <main>                       lea    0x4(%esp),%ecx                      │
   │0x56555501 <main+4>                     and    $0xfffffff0,%esp                    │
   │0x56555504 <main+7>                     pushl  -0x4(%ecx)                          │
   │0x56555507 <main+10>                    push   %ebp                                │
   │0x56555508 <main+11>                    mov    %esp,%ebp                           │
   │0x5655550a <main+13>                    push   %ebx                                │
   │0x5655550b <main+14>                    push   %ecx                                │
   │0x5655550c <main+15>                    call   0x56555529 <__x86.get_pc_thunk.ax>  │
   │0x56555511 <main+20>                    add    $0x1acb,%eax                        │
B+>│0x56555516 <main+25>                    mov    %eax,%ebx                           │
   │0x56555518 <main+27>                    call   0x5655552d <swap>                   │
   │0x5655551d <main+32>                    mov    $0x0,%eax                           │
   │0x56555522 <main+37>                    pop    %ecx                                │
   │0x56555523 <main+38>                    pop    %ebx                                │
   │0x56555524 <main+39>                    pop    %ebp                                │
   │0x56555525 <main+40>                    lea    -0x4(%ecx),%esp                     │
   │0x56555528 <main+43>                    ret                                        │
   │0x56555529 <__x86.get_pc_thunk.ax>      mov    (%esp),%eax                         │
   │0x5655552c <__x86.get_pc_thunk.ax+3>    ret                                        │
   │0x5655552d <swap>                       push   %ebp                                │
   │0x5655552e <swap+1>                     mov    %esp,%ebp                           │
   │0x56555530 <swap+3>                     sub    $0x10,%esp                          │
   │0x56555533 <swap+6>                     call   0x56555529 <__x86.get_pc_thunk.ax>  │
   │0x56555538 <swap+11>                    add    $0x1aa4,%eax                        │
   │0x5655553d <swap+16>                    lea    0x3c(%eax),%edx                     │
   │0x56555543 <swap+22>                    lea    0x2c(%eax),%ecx                     │
   │0x56555549 <swap+28>                    lea    0x4(%ecx),%ecx     

事情就是這樣。 請給我任何線索如何使用 GDB 從一開始就完成組裝? 每次我啟動程序時,它都從 main() function 開始,而不是 __libc_start_main() 的開頭。

如果有人能幫我這個忙,我將不勝感激。

使用 GDB 的starti命令run ,但在第一條用戶空間指令之前停止(即使它在動態鏈接器內部)。 這就像在run之前在入口點設置一個臨時斷點。 對於不支持starti的舊 GDB 版本,有像b *0這樣的黑客來創建一個無效的斷點,然后在使用run后將其刪除。 停在 GDB 的第一條機器碼指令處

或者,如果您只想從__libc_start_main而不是_start或動態鏈接器的_start開始,請在此處設置斷點。

從那里您可以使用si (又名stepi )按說明單步執行。

您可能需要layout reglayout asm

您可能想要構建一個非 PIE 可執行文件( gcc -no-pie -fno-pie ),盡管無論哪種方式,動態 linker 都會在跳轉到可執行文件的_start之前執行一些代碼。


如何從我的代碼片段的 0x565554fd 開始?

這是一個完全不同的問題。

這只是main的頂部

GDB部分是為C調試而設計的,有時喜歡省去你處理function序言的麻煩。 在這種情況下,32 位main的序言對齊堆棧並使用 PC 相關方法獲取 GOT 指針(因為它是 PIE 可執行文件)。

您可以只b *0x565554fd並再次run您的程序。

或者使用非 PIE,您可以在第一次運行之前輕松獲取main的真實地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM