兩次記憶體斷點法尋找OEP脫UPX殼

2021-06-16 16:19:47 字數 3215 閱讀 7354

逆向過程中通過會遇到脫殼的過程,而脫殼的方式有有多重,如果手工脫殼,需要找到oep。

所謂「兩次記憶體斷點法尋找oep」,按照《加密與解密*第三版》上的解釋來說,就是這樣的。

一般的外殼會依次對.text、.rdata、.data、.rsrc區塊進行解壓(解密)處理,所以,可以先在.rdata、.data等區塊下記憶體訪問斷點,中斷後,此時**已解壓,接著再對**段(.text)下記憶體訪問斷點,即可到達oep。

我個人的理解是所有節區都解壓完畢之後,然後程式的執行流會轉移到oep,這個時候自然回去訪問相應的**,所以就會斷下;實際操作的時候還需要多乙個跟蹤步驟。

這裡以乙個upx加殼的程式為例:

首先od引導程式,alt + m開啟記憶體對映檢視,找到主模組的資料段或者資源段f2下訪問中斷,如圖。

然後f9執行程式,會自動斷下,再次alt + m開啟記憶體對映檢視,找到**段f2下訪問中斷,如圖。

之後f9執行,會再次斷下。這個時候仍然alt + m開啟記憶體對映檢視,觀察一下主模組的區塊。

123

4567

891011

0040ba75    8d8430 58b00000 lea

eax,

dword

ptrds:[

eax+

esi+b058]

0040ba7c 01f3 add

ebx,

esi0040ba7e

50push

eax0040ba7f 83c7 08

addedi,8

0040ba82 ff96 94b00000 call

dword

ptrds:[

esi+b094]

; kernel32.loadlibrarya

0040ba88

95xchg

eax,

ebp0040ba89 8a07 moval,

byte

ptrds:[

edi]

0040ba8b

47inc

edi0040ba8c 08c0 oral,

al0040ba8e ^ 74 dc je

short 0040ba6c

0040ba90 89f9 mov

ecx,

edi

memory map, 專案 18

位址=00401000

大小=00008000 (32768.)

屬主=upxdemo 00400000

區段=upx0

型別=映像 01001002

訪問=r

初始訪問=rwe

memory map, 專案 19

位址=00409000

大小=00003000 (12288.)

屬主=upxdemo 00400000

區段=upx1

包含=sfx,**

型別=映像 01001002

訪問=r

初始訪問=rwe

看到upx0和upx1到底哪乙個是真實的**塊呢?需要試一下。對於upx0,va的範圍是00401000~00409000,對於upx1,va的範圍是00409000~0040c000。可以在od的命令列中執行tc eip<00409000,按enter執行,發現來到了oep了。(同樣可以測試tc eip<0040c000,但得到的不是oep)。

123

4567

891011

1213

1415

1617

1819

2021

00401120

55push

ebp00401121 8bec mov

ebp,

esp00401123 6a ff push-1

00401125

68 b8504000 push 004050b8

0040112a

68 ec1d4000 push 00401dec

0040112f

64:a1 00000000

moveax

,dword

ptrfs:[

0]00401135

50push

eax0040113664:

8925

0000000>mov

dword

ptrfs:[

0],esp

0040113d 83ec 58

subesp,58

00401140

53push

ebx00401141

56push

esi00401142

57push

edi00401143

8965 e8 mov

dword

ptrss:[

ebp-18]

,esp

00401146 ff15 28504000

call

dword

ptrds:[

405028

]; kernel32.getversion

0040114c 33d2 xor

edx,

edx0040114e 8ad4 movdl,

ah00401150

8915

14854000

movdword

ptrds:[

408514],

edx00401156 8bc8 mov

ecx,

eax00401158

81e1 ff000000 and

ecx,0ff

0040115e 890d 10854000

movdword

ptrds:[

408510],

ecx00401164 c1e1 08

shlecx

,8

附:

tc (trace in till condition)跟蹤進入直到條件

更多參考:

兩次記憶體斷點法尋找OEP

逆向過程中通過會遇到脫殼的過程,而脫殼的方式有有多重,如果手工脫殼,需要找到oep。所謂 兩次記憶體斷點法尋找oep 按照 加密與解密 第三版 上的解釋來說,就是這樣的。一般的外殼會依次對.text rdata data rsrc區塊進行解壓 解密 處理,所以,可以先在.rdata data等區塊下...

兩次過 Lintcode 75 尋找峰值

你給出乙個整數陣列 size為n 其具有以下特點 假定p是峰值的位置則滿足a p a p 1 且a p a p 1 返回陣列中任意乙個峰值的位置。給出陣列 1,2,1,3,4,5,7,6 返回1,即數值 2 所在位置,或者6,即數值 7 所在位置.time complexity o logn 普通遍...

Linux下C語言記憶體兩次釋放問題

在linux中,c語言程式設計的永遠讓人最頭痛的問題還是記憶體管理了。特別在記憶體釋放上面,其中有乙個標準就是記憶體一定要釋放,否則就會造成記憶體洩露問題。但是釋放的時候也要隨時注意,因為釋放一次是ok的,但是同一塊記憶體釋放2次的話就是錯誤的了。道理大家很多人都懂,但是實際用起來的時候就會出很多頭...