查看objdump -d ELFfile
的輸出,我無法區分直接和間接跳轉/調用。有什麼建議麼?objdump的輸出中的直接和間接調用/跳轉
回答
間接調用和跳轉在指令之後和位於callq *%r13
和jmpq *0x204d8a(%rip)
之類的位置之前有一個*
。
我將展示從我的x86-64 Linux機器兩個真實的例子:在C標準庫中調用用戶提供的比較函數
- 的qsort()動態鏈接可執行程序調用的strcmp()
glibc中的qsort()執行實際調用不同的排序一算法取決於輸入大小。一種這樣的實現是msort_with_tmp()在/lib64/libc.so.6:
0000003cbde37d70 <msort_with_tmp.part.0>:
<...>
3cbde37dd6: 4c 8b 68 10 mov 0x10(%rax),%r13
<...>
3cbde37e2f: 41 ff d5 callq *%r13
的代碼片段上面的比較函數的地址移動到R13並最終確實間接調用。
對於動態鏈接的可執行文件調用的strcmp(),我將使用/斌/真作爲一個例子。在主可執行的strcmp()所有來電被轉換爲對PLT存根的電話,STRCMP @ PLT:
$ gdb /bin/true
(gdb) disassemble '[email protected]'
0x401350 <+0>: ff 25 8a 4d 20 00 jmpq *0x204d8a(%rip) # 0x6060e0 <[email protected]>
0x401356 <+6>: 68 19 00 00 00 pushq $0x19
0x40135b <+11>: e9 50 fe ff ff jmpq 0x4011b0
在第一個指令,0x204d8a(%RIP)使用RIP相對尋址定位[email protected]。
如果我們試圖檢查什麼價值[email protected]擁有在運行時:
(gdb) break *0x401350
(gdb) run --XXX
Breakpoint 1, 0x0000000000401350 in [email protected]()
(gdb) p/a '[email protected]'
$1 = 0x3cbdf2fbe0 <__strcmp_sse42>
(gdb) break *0x3cbdf2fbe0
Breakpoint 2 at 0x3cbdf2fbe0: file ../sysdeps/x86_64/multiarch/strcmp-sse42.S, line 128.
(gdb) continue
Continuing.
Breakpoint 2, __strcmp_sse42()
at ../sysdeps/x86_64/multiarch/strcmp-sse42.S:128
128 mov %esi, %ecx
我們看到,[email protected]點__strcmp_sse42()在的/ usr /lib64/libc.so.6。
因此,我們遇到的第一個間接跳轉,jmpq * 0x204d8a(%RIP)在STRCMP @ PLT,最終跳到__strcmp_sse42()。這是STT_GNU_IFUNC機制。它使用動態鏈接程序根據CPU功能在運行時查找最合適的strcmp()變體。
在x86-64 CPU上,調用和跳轉指令相對於%rip隱含。
所以相關模式是:
jmpq $6 # Direct, relative: Jump to %rip+0x6
jmpq *$6 # Direct, absolute: Jump to 0x6
jmpq %r13 # Indirect, relative: Jump to %rip+%r13
jmpq *%r13 # Indirect, absolute: Jump to %r13. Aka "movq %r13, %rip"
然後是雙間接模式:
jmpq 0x20(%r13) # Jump to %rip + *(%r13 + 0x20).
jmpq *0x20(%r13) # Jump to *(%r13 + 0x20)
最後的尋址方式是用C很常見++拆卸作爲
callq *0x20(%r13)
其中%r13包含一個vtable的地址。因此,它在偏移量爲0x20的vtable中查找條目,然後調用該條目指向的函數。 它始終是絕對模式(即不是相對於%rip),因爲vtable是從多個調用站點使用的,所以%rip相對沒有任何意義。
而'switch'和函數指針調用。 – 2015-06-18 15:51:07
- 1. QSlider鼠標直接跳轉
- 2. Django直接跳轉到div
- 3. .nextLine()直接跳轉到下一個輸出
- 4. 如何找出直接或間接調用屬性的方法?
- 5. 跳轉和跳轉和鏈接不同
- 6. Visual Studio中聯彙編直接跳轉
- 7. MIPS:使用間接跳轉的分支?
- 8. 用於DLL函數調用的間接跳轉
- 9. objdump和解析本地函數調用的鏈接?
- 10. html5和mysql之間的直接連接
- 11. 間接跳轉目的地計算
- 12. 輸出部門和直接報告
- 13. objdump的表示鏈接
- 14. 調用Ant目標直接和間接地根據病情
- 15. ffmpeg直接輸出到HDFS
- 16. 直接調出對話框?
- 17. 在LLVM中直接跳轉的分支指令
- 18. 宏不是直接調用擴大,但擴大的間接
- 19. 直接運行SQL查詢的輸出
- 20. 負載輸出變量直接PowerShell的
- 21. 如何調用直接連接中間件?
- 22. 當使用vptr直接調用虛函數時理解輸出
- 23. API調用dononreferencedcredit和直接支付之間的差異
- 24. mutableArrayValueForKey和調用insertObject之間的區別:inEmployeesAtIndex:直接
- 25. 模擬準備和直接準備調用之間的區別?
- 26. crontab中直接抑制某些輸出
- 27. wordpress上的跳轉鏈接
- 28. 瀏覽器跳過「if」,「else if」,直接跳轉到「else」語句
- 29. 直接和間接遞歸問題
- 30. 庫函數objdump輸出
http://stackoverflow.com/questions/9223756/what-does-an-asterisk-before-an-address-mean-in-x86-64-att-assembly – 2015-06-18 15:48:31