這是我的計劃:修補一個簡單的C程序與IDA PRO GET分段故障
#include <stdio.h>
int main(){
int var=5;
if(var==5) printf("Accesso effettuato!");
else printf("Access denied");
}
我改變操作碼......在十六進制編輯這樣的圖像中,但是當我運行我的程序,我得到分段故障。
這是我的計劃:修補一個簡單的C程序與IDA PRO GET分段故障
#include <stdio.h>
int main(){
int var=5;
if(var==5) printf("Accesso effettuato!");
else printf("Access denied");
}
我改變操作碼......在十六進制編輯這樣的圖像中,但是當我運行我的程序,我得到分段故障。
你得到一個分段錯誤,因爲操作碼83 05
指其中address
和constant
通過未來五年的字節05 89 45 F4 75
確定的指令ADD DWORD PTR [address],constant
。所以在這種情況下,指令是ADD DWORD PTR [F4458905],75
。所以你引用了一個無效的內存地址。
原來的指令是:
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
Cmp ecx,ecx是83 F9 F9?無論如何,謝謝你的回答,我明白我的錯誤 –
@Usi,操作碼並不那麼簡單,你需要一個彙編程序,否則IDA Pro應該能夠爲你做到這一點。 – paxdiablo