2020-11-21(线性扫描反汇编算法和递归下降扫描反汇编算法)
push ebp
jmp addr1
db 0xE8
addr1:
mov abp,esp
sub esp,0x100
根據線性掃描反匯編算法,當反匯編器解析完jmp addr1指令后,會接著從下一個0xE8開始進行解析,而0xE8為call指令的起始字節,就會導致反匯編器認為從0xE8開始的5個字節為一條call 指令,從而讓后續的指令全部被錯誤解析
而對于以IDA Pro為代表的遞歸下降反匯編器,由于遞歸下降反匯編算法在遇到無條件跳轉時,會轉向跳轉的目標地址遞歸地繼續解析指令,就會導致插入的0xE8字節直接被跳過。然而,遞歸下降反匯編器盡管部分地模擬了程序執行的控制流過程,但它并不是真正運行,所以不能獲取到所有的信息
例如:
push ebp
jz addr1
jnz addr1
db 0xE8
addr1:
mov abp,esp
sub esp,0x100
即將一條無條件跳轉語句改為兩條成功條件相反的條件跳轉語句。由于遞歸下降反匯編算法不能獲取到程序運行中的上下文信息,遇到條件跳轉語句時,它會遞歸地將跳轉的分支與不跳轉的分支都進行反匯編。顯然,在反匯編完jnz后,它不跳轉的分支就是下一地址,從而使0xE8開頭的“指令”被解析
實際操作時,往往打亂順序,即“亂序”,從而達到類似控制流混淆的效果,例如:
push ebp
jz addr1
jnz addr1
db 0xE8
addr3:
sub esp,0x100
…………
addr2:
mov abp,esp
jmp addr3
總結
以上是生活随笔為你收集整理的2020-11-21(线性扫描反汇编算法和递归下降扫描反汇编算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020-11-20(页帧)
- 下一篇: 2020-11-22(工作集与常驻集)