2012-01-26 25 views
0

這是我的計劃:修補一個簡單的C程序與IDA PRO GET分段故障

#include <stdio.h> 

int main(){ 
    int var=5; 
    if(var==5) printf("Accesso effettuato!"); 
    else printf("Access denied"); 

} 

我改變操作碼......在十六進制編輯這樣的圖像中,但是當我運行我的程序,我得到分段故障。

image1

image2

enter image description here

回答

4

你得到一個分段錯誤,因爲操作碼83 05指其中addressconstant通過未來五年的字節05 89 45 F4 75確定的指令ADD DWORD PTR [address],constant。所以在這種情況下,指令是ADD DWORD PTR [F4458905],75。所以你引用了一個無效的內存地址。

1

原來的指令是:

83 F9 05 cmp ecx, 5 

它看起來像你想改變成一個恆定comaparison,是這樣的:

83 05 05 cmp 5, 5  ; not what you think it is! 

我懷疑這樣的野獸,即使存在,因爲它的有效性至多是有問題的。比較兩個常數似乎是硅的浪費。

你是什麼實際上改變它是一個幾乎肯定解除引用無效地址的指令)。

作爲選項一,您可以用一個設置零位的指令替換三個字節序列(因爲檢查幾條指令是一條jnz指令),並用足夠的nop操作將其填充到相同的大小。

或者,找一個cmp ecx, ecx聲明(再次適當nop填充),這樣你可以肯定所有標誌設置是否正確。根據GNU彙編器as

39 c9  cmp %ecx, %ecx 
90   nop 
+0

Cmp ecx,ecx是83 F9 F9?無論如何,謝謝你的回答,我明白我的錯誤 –

+0

@Usi,操作碼並不那麼簡單,你需要一個彙編程序,否則IDA Pro應該能夠爲你做到這一點。 – paxdiablo