使用GDB除錯組合語言,檢視plt過程

2021-08-28 01:23:36 字數 3251 閱讀 7984

#include 

int main(void)

非常簡單的乙個hello world程式,編譯程式之後對程式進行反彙編objdump -d main

本文使用gdb的一些操作

ni 跳過當前彙編指令

si 進入彙編指令

x 位址 檢視記憶體位址的值

disassembe 檢視彙編**

好了,在進行除錯之前,先看一下檔案中plt段需要重定向的符號:readelf -r main

重定位節 '.rel.dyn' 位於偏移量 0x290 含有 1 個條目:

偏移量 資訊 型別 符號值 符號名稱

08049ffc 00000206

r_386_glob_dat

00000000 __gmon_start__

重定位節 '.rel.plt' 位於偏移量 0x298 含有 2 個條目:

偏移量 資訊 型別 符號值 符號名稱

0804a00c 00000107

r_386_jump_slot

00000000 puts@glibc_2.0

0804a010

00000307

r_386_jump_slot

00000000 __libc_start_main@glibc_2.0

這裡只需要關注plt段的重定向,在這裡只有兩個符號需要重定向,重點是printf的重定向過程。

printf的位址是放在got.plt這個段中的,這個段有三個預先按順序定義好的值:

1、dynamic段的位址

2、module id

3、_dl_runtime_resolve()函式位址

那麼第四肯定就是printf的位址了

來進行一下除錯,首先跳到main函式,有這麼一段:

0x08048419

<+14>: sub $0x4,%esp

0x0804841c

<+17>: sub $0xc,%esp

0x0804841f

<+20>: push $0x80484c0

=> 0x08048424

<+25>: call 0x80482e0

@plt>

0x08048429

<+30>: add $0x10,%esp

0x0804842c

<+33>: mov $0x0,%eax

很明顯在箭頭指向的位置,就是跳到plt中,跳進去之後:

=> 0x080482e0 <+0>:     jmp    *0x804a00c

0x080482e6 <+6>: push $0x0

0x080482eb <+11>: jmp 0x80482d0

這時準備跳到printf函式的入口,但是這時肯定不是正確的位址,因為動態鏈結器使用了延遲繫結的技術,只有在第一次用的時候才會進行真正的重定向,這時候檢視一下0x804a00c這個記憶體的值,發現為0x080482e6 ,也就是下一條彙編指令的位置,繼續跟蹤跳轉到0x80482d0

end

of assembler dump.

(gdb) si

0x080482d0

in ?? ()

(gdb) si

0x080482d6

in ?? ()

(gdb) si

_dl_runtime_resolve () at ../sysdeps/i386/dl-trampoline.s:35

35 ../sysdeps/i386/dl-trampoline.s: 沒有那個檔案或目錄.

這裡不知道為什麼會有「?」,暫且忽略,經過了幾次跳轉之後來到了_dl_runtime_resolve 函式,這個函式再進行動態繫結,這個函式裡面的彙編**:

=> 0xb7ff0000

<+0>: push

%eax

0xb7ff0001

<+1>: push

%ecx

0xb7ff0002

<+2>: push

%edx

0xb7ff0003

<+3>: mov 0x10(%esp),%edx

0xb7ff0007

<+7>: mov 0xc(%esp),%eax

0xb7ff000b

<+11>: call 0xb7fe97e0

<_dl_fixup>

0xb7ff0010

<+16>: pop

%edx

0xb7ff0011

<+17>: mov (%esp),%ecx

0xb7ff0014

<+20>: mov %eax,(%esp)

0xb7ff0017

<+23>: mov 0x4(%esp),%eax

0xb7ff001b

<+27>: ret $0xc

(gdb) x 0x804a00c

0x804a00c: 0xb7e65ca0

這才是printf函式真正的入口。

這樣重定向的過程算是完成了。

(gdb) x 0x804a000

0x804a000: 0x08049f14

同時使用readelf檢視.dynamic在main中的位置:

[21] .jcr              progbits        08049f10 000f10 000004

00 wa 004

[22] .dynamic dynamic 08049f14 000f14 0000e8

08 wa 604

[23] .got progbits 08049ffc 000ffc 000004

04 wa 0

04

也是8049f14,這樣就證實了我們的推斷。

彙編 使用VS2008檢視反組合語言

使用vs2008是可以檢視反組合語言的,vs2008進入反彙編檢視要在除錯的狀態下,要在除錯的狀態下,要先在return 0 前面設定斷電斷點,在按f11進入除錯狀態,在按alt 8顯示反組合語言 在一台pc機中記憶體的作用僅次於cpu,離開了記憶體再好的cpu也無法工作,磁碟不同於記憶體,磁碟上的...

組合語言除錯DEBUG命令

1 顯示命令d d 位址 d 範圍 如不指定範圍,一次顯示8行 16個位元組。d 預設段暫存器為ds,當前偏移位址 d ds 100 d cs 200 d 200 100 d 200 200為偏移位址,預設段暫存器ds d ds 100 110 d 100 l 102.修改命令e e 位址 從指定位...

組合語言rep movsd 的使用

mov esi,offset s1 mov edi,offset s2 mov ecx,10 cld rep movsd 1.rep movsd 每次ecx!0便執行movsd 然後ecx ecx 1 movsd移動ds si 到es di 在32位彙編下可以用esi代替si,edi代替di 2.同...