2016-05-13 45 views
0

我想分析一個核心轉儲。核心上的堆棧框架很少,所以我使用反彙編程序。現在反彙編程序給出了一個彙編指令列表。現在我想檢查一下特定寄存器的值。由於相同的寄存器被使用多次,我認爲我試圖訪問的值是最後一個現值。那麼,有沒有辦法讓我去特定的指令,然後檢查寄存器值?如何去反彙編程序顯示在gdb的核心中的指令

例子:

gdb binary core 
disas /s fucntion_name 
    0x00007fbb3cc51a9c <+0>:  push %rbp 
    0x00007fbb3cc51a9d <+1>:  mov %rsp,%rbp 
    0x00007fbb3cc51aa0: sub $0x10,%rsp 
    0x00007fbb3cc51aa4: mov %rdi,-0x8(%rbp) 
    0x00007fbb3cc51aa8: cmpq $0x0,-0x8(%rbp) 
    0x00007fbb3cc51aad: je  0x7fbb3cc51b0b 
    0x00007fbb3cc51aaf: mov 0x2030c3(%rip),%eax 
    0x00007fbb3cc51ab5: test %eax,%eax 
    0x00007fbb3cc51ab7: je  0x7fbb3cc51b0b 
    0x00007fbb3cc51ab9: mov -0x8(%rbp),%rdi 
    0x00007fbb3cc51abd: callq 0x7fbb3caf8df0 
    0x00007fbb3cc51ac2: mov -0x8(%rbp),%rax 
    0x00007fbb3cc51ac6: mov 0x28(%rax),%eax 
    0x00007fbb3cc51ac9: lea -0x1(%rax),%edx 
    0x00007fbb3cc51acc: mov -0x8(%rbp),%rax 
    0x00007fbb3cc51ad0: mov %edx,0x28(%rax) 
    0x00007fbb3cc51ad3: mov -0x8(%rbp),%rax 
    0x00007fbb3cc51ad7: mov 0x28(%rax),%eax 
    0x00007fbb3cc51ada: test %eax,%eax 
    0x00007fbb3cc51adc: jne 0x7fbb3cc51b02 
    0x00007fbb3cc51ade: mov -0x8(%rbp),%rax 
    0x00007fbb3cc51ae2: mov 0x2c(%rax),%eax 

現在,假設我要檢查登記冊「RBP」的值在指令地址爲0x00007fbb3cc51ac2;我該如何檢查?我無法運行程序,因爲它只是客戶的核心文件。

+0

你不能在同一幀(至少在覈心轉儲中)看到以前的寄存器值,但用我對x86-64彙編的基本知識,我看不到任何在函數開始後改變rbp的指令。你可以在前一幀看到rbp的值,做「up」並檢查那裏的值。 – dbrank0

回答

1

由於相同的寄存器被使用多次,我認爲我試圖訪問的值是最後的當前值。

使用寄存器不會改變它的值,只寫入它。

如果寄存器被多次寫入,那麼是的:你會在覈心轉儲中看到寫入它的最後一個值。

那麼,有沒有辦法讓我可以去特定的指令,然後檢查寄存器值?

你要求的是有效的reverse debugging。雖然它可以完成,但它帶來了非常大的開銷(在內存和執行速度方面)。一個「正常」的核心轉儲當然沒有信息來執行反向調試。

我想檢查地址爲0x00007fbb3cc51ac2的指令的寄存器「rbp」的值;我該如何檢查?

這是比較容易的:因爲%rbp只存儲一次(指令在0x7fbb3cc51a9d)的值應該是相同的,因爲它是在功能的任何其它位置。

注意:這裏假定您調用的每個函數都保存並恢復了%rbp(這是ABI所要求的)的值。有可能是其中一個例程有問題,並且沒有正確地恢復該值,在這種情況下,你大部分都是搞錯了。但是,您還應該能夠從%rsp恢復%rbp的值:在0x7fbb3cc51a9d後它們相等,然後%rsp0x7fbb3cc51aa0處遞減0x10。所以它一定是%rbp == %rsp + 0x10

相關問題