linux反彙編旁門左道小技巧一則

我個是我自已在開發過程中發現的一個小技巧。不算什麼牛X的技巧。只是帖出來大家一起欣賞一下而已。權當一道小菜吧。

gdb反彙編調試技巧 在linux下很多時候我們需要反彙編我們的源碼,然後根據所得到的信息(例如相關的寄存器)進一步定位問題所在。這時候我們很多時間用objdump或者直接用gdb。在用gdb的情況下可以對可疑的函數採用disassemble funcname來反彙編對應的funcname函數。但如果在對彙編不是很熟的情況下我們通常不容易將源碼與對應的彙編匹配起來思考。例如:

void main()
{
inta_main=1;
int i = 0x77;        //技巧所在
a_main=(int)yaya;
    foo();
int j = 0x88;        //技巧所在
}

當我們disassemble這個函數時得到的彙編代碼可能比較多,而我們感興趣的只有func2這一段代碼。就可在上下兩段中加入”標識行”。然後在反彙編的彙編代碼中查找標識77、88然後只要看這中間的就OK了。注意千萬不能加優化選項,因為加優化選項這些沒有起實際作用的代碼會被優化掉。另外最好用16進製作標識,因為立即數會以16進制顯示。 在不優化的時候其反彙編的代碼如下:

0x080483d6 <main+0>: lea 0x4(%esp),%ecx
0x080483da <main+4>: and $0xfffffff0,%esp
0x080483dd <main+7>: pushl -0x4(%ecx)
0x080483e0 <main+10>: push %ebp
0x080483e1 <main+11>: mov %esp,%ebp
0x080483e3 <main+13>: push %ecx
0x080483e4 <main+14>: sub $0x10,%esp
0x080483e7 <main+17>: movl $0x1,-0x10(%ebp)

0x080483ee <main+24>: movl $0x77,-0xc(%ebp)
0x080483f5 <main+31>: movl $0x804839f,-0x10(%ebp)
0x080483fc <main+38>: call 0x80483ba <foo 0x08048401 <main+43>: movl $0x88,-0x8(%ebp)
0x08048408 <main+50>: add $0x10,%esp
0x0804840b <main+53>: pop %ecx
0x0804840c <main+54>: pop %ebp
0x0804840d <main+55>: lea -0x4(%ecx),%esp
0x08048410 <main+58>: ret

我們只需要查看紅色字符中的代碼段就OK了。


书籍推荐