CE教程第八关——搜索4级指针
這個第八題我花了好幾個小時,最后靠畫圖弄明白的。
不管是C語言還是反匯編,涉及到指針和內存,最直觀的理解方式就是畫圖。
題目
步驟 8: 多級指針: (密碼=525927)
在這一步將解釋如何使用多級指針。 在第 6 步,你已經清楚 1 級指針的概念和用途,并可以利用數值的首個地址找到存放數據真正的基址。
在本關中,你將看到 4
級指針,它由第一個指針指向第二個指針,再由第二個指針指向第三個指針,由第三個指針指向第四個指針,最終指向健康值的真正地址。 開始的幾步與在第
6
步中的操作基本相同。找出是什么訪問了這個地址,然后分析匯編指令,查找指針地址中的數值,以及它的偏移量,將它們記下來。但這次你按數值找出的仍然是一個指針,你得依據這些數值,使用同樣的操作方法找出指向這個指針的指針。看看是什么訪問了你發現的那個指針地址,分析匯編指令,留意可能的代碼和偏移量,并加以利用。
持續這種過程,直到不能更進一步查找為止(通常基址為靜態時,地址將以綠色標示)。 點擊"改變數值"改變健康值,
如果你發現列表中那些指針地址所指向的值發生同樣的變化時,那表示你可以試著將基址中的值更改為 5000,并鎖定它,以便完成本關的任務了。
備注1: 本步驟也可以使用自動匯編程序腳本或者使用指針掃描器加以解決。 備注2: 在某些情況下,可以改變 CE 軟件"代碼查找"的相關設置。
當你遇到類似于 mov eax,[eax] 的指令時,調試程序將顯示改變之后的寄存器中的值,也許利用它更容易找出指針的位置。
備注3:
你還在讀?!當你查看匯編指令時你可能已經注意到,這些指針是在相同的代碼塊(相同的程序,如果你懂匯編,可以查看程序的起始代碼)位置被讀寫。這種情況并不總會發生,但是當你在查找某個指針遇到問題的時候,沒準能起到很大的用處。
這關的意思是要找到指向變量的4級指針,在第六關的時候我學習了如何找1級指針,但是為了以后忘記了回來復習,我還是從頭開始記錄所有步驟。
?
?
?
解法
首先,讓數值變化,最終找到數值存儲的地址。
顯然,在內存中是這樣子的 ↓
由于變量值會改變,所以不寫3261,用字符串value代替。
下一步,我想知道這個變量被哪條語句修改了,只需右鍵搜索結果,選擇“找出是什么改寫了這個地址”
然后點擊游戲按鈕,改變變量值。
發現是這條指令改寫了變量值,esi+18 就是value的地址(也就是前面搜索到的0019DE10),eax是新值。esi 就是我們要找的第一個指針,它加上一個偏移量18就指向了value,做一個減法算出esi的值等于 0019DDF8。
要尋找二級指針,只需要找到是誰存儲了 0019DDF8。
做法是開始新的掃描,16進制搜索 0019DDF8,
一般會找到唯一結果
內存示意圖
接下來,希望找到誰通過 0019DDF8 修改了value,右鍵剛才的結果,選擇“誰訪問了…”
訪問 06508070 可能就是間接修改value的代碼。修改value,發現有兩條語句訪問了 06508070
我們要關注的是第二條 mov esi,[esi]
源操作數沒有偏移,意味著二級指針不需要加偏移就能找到一級指針,示意圖如下:
同樣地,16進制搜索這個 06508070,找到其地址。(如果有多個結果,只需看看誰訪問了它,修改value無結果的就可以排除了)
只有第五個地址,修改value會被訪問。
和上一步一樣的推理過程,畫出內存示意圖如下。
至此,找到了第二級指針。用同樣的方法,直到找到顏色為綠色的地址,即第四級指針。
這個 006426E0 就是四級指針了。補上完整的內存示意圖:
最后,點擊手動添加地址,勾選指針,填入基址 006426E0,CE自動計算出三級指針的值 0011DD30,如下圖:
根據內存示意圖,依次添加 0C 14 0 18 偏移量,就能找到 value 啦!
最后根據題目要求,將數值改為5000,鎖定他,然后改變指針,即可通關。
這關的意思是,有些變量是動態分配的,并且可能有多級指針,我們要找到最高級的那個不變的指針,才能一直修改變量。
以C語言舉例,其實就是要找到 p4。
總結
以上是生活随笔為你收集整理的CE教程第八关——搜索4级指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql中的blob和text区别
- 下一篇: 题解 P1876 【开灯】