[英]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 reg
或layout 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.