180705 逆向 Linux的逆向

2021-08-21 10:05:42 字數 3130 閱讀 1584

與pe程式基本類似,將elf程式拖入ida也可以快速的反彙編,主要借助hex-ray外掛程式來反編譯出可讀性較高的偽**

trickgdb是unix和unix-like下的乙個除錯工具

它沒有圖形化介面,通過簡單明瞭的命令來除錯程式

常用命令:

- r/run [args]

引導程式後使用run命令啟動程式

- b/break [address/functions]

在某個位址(記得在位址前要加*,代表這是乙個位址)或符號名

- c/continue

繼續執行

- n/ni(next)

執行一行源**/彙編**但不進入函式內部

建議費事點使用ni,可以避免在有除錯資訊的時候產生非常神奇的事情(明明只單步了一下彙編卻跳了好幾行)

- s/si(step)

執行一行源**/彙編**並進入函式內部

- x/examine

按照一定格式列印記憶體位址處的資料

- cout表示列印的數目,預設為1

- fmt表示列印格式,如x為16進製制,d為10進製,c為字元,s為字串等,預設為上次使用的fmt

- size表示列印單位,如b(byte), h(halfword), w(word), g(giant)等,預設為上次使用的size

- address表示目標位址,也可使用*來取指標值或取寄

存器的值

−set

寫記憶體/

暫存器e

g:se

t 取寄存

器的值−

set寫

記憶體/寄

存器eg

:set

rsp=0x123456

set *0x123456=0x654321

有時elf程式開啟了pie(**位址隨機化),會導致程式每次載入的位址都不同,進而在某些沒有符號的函式中難以下斷

此時可以對main/printf/gets/puts等已知符號的函式下斷,然後找到主函式呼叫的偏移,進而根據檔案中的偏移來找到載入基址。有了基址以後就好計算其他位址的虛擬位址了

遠端端的監聽程式在ida根目錄/dbgsrv/下,linux對應的就是linux_server/linux_server64,由程式版本決定使用哪個。

將其複製至遠端系統後以管理員許可權執行即可

ida選擇debugger-remote linux debugger後,在process options中設定hostname(ip),port保持預設的23946即可,password輸入該使用者的passwd

start process(f9)可以直接啟動程式,在監聽伺服器的終端中進行回顯和輸入

也可以通過attach to process來附加正在執行的程式

babyre

hint:smc

所謂花指令即是不會執行或是執行了以後沒有任何用處的彙編指令

當在靜態分析時遇到從沒見過的彙編指令、程式段中出現了bad byte、或是jmp等跳轉指令的目標是乙個彙編**的中間時,很有可能這裡出現了花指令

當在使用ida的hex-rays外掛程式時,如果遇到棧指標錯誤或是反編譯**明顯不對勁等情況時,也有可能是花指令在作祟

最簡單的確認花指令與否的手段就是動態除錯,看程式是否會執行到該處地方(建議在不可辨識的指令之前下斷)

但是未解密的smc**也有可能產生上述現象,因此需要自行甄別,通常情況下大段的**更可能是未解密**,而花指令通常僅影響數條彙編指令

花指令一般具備一些格式特徵,以便新增和跳過髒字節,例如

jmp c

–bad byte–

c: other instruction

當花指令較多時這些特徵就能幫助識別

關於去除,通常是將髒字節全部改為nop,即0x90

nop是單位元組指令,因此不會影響到其他指令的解析,同時它的作用是什麼都不做,因此也不會影響hex-rays的反編譯

手動在ida中去除花指令

實驗–easy_junk

編寫idc指令碼去除花指令

實驗–hard_junk

linux中由於與windows系統機制的一些不同,因此反除錯也有一些區別

不過由於斷點位元組同樣是0xcc,因此在檢測0xcc或者hook0xcc的反調方法中是一樣的

大部分偵錯程式、注入的基礎技術都使用的是ptrace

而乙個程序只能被乙個程序ptrace

trace_me就是乙個對自己除錯的引數

如果先執行的trace_me,那麼之後的偵錯程式就無法再附加到該程序上

如果直接由偵錯程式啟動,那麼trace_me會返回false表示ptrace失敗

從而檢測到偵錯程式的存在

反制方法

patch

ld_preload

gdb中set environment ld_preload ./ptrace.so

直接啟動時ld_preload=./ptrace.so ./traceme

可防止自校驗

除錯過程中篡改trace_me的返回值

在/proc目錄中有每個程序的狀態,通過pid可以讀到指定程序的狀態,包括程序名、state、ppid等等

其中ppid就是父程序的pid,在沒有父程序時該項為0,而被偵錯程式啟動時將會顯示偵錯程式的pid,因此可以通過ppid來檢視除錯狀態

另外tracepid會直接顯示偵錯程式的pid,當被附加時ppid將不會是偵錯程式,但tracepid會改變

反制方法

主要是hook/靜態分析open函式,因為status是乙個檔案描述符,必須通過open來讀取

因此在檢視匯入符號時如果發現open就要引起注意了,也許是乙個反除錯機制

ltrace命令可以快速地檢視庫函式的呼叫

另外要注意的是,open函式的底層實現是通過linux的syscall(__nr__open, sys_open)來實現的,有時為了規避匯入函式的問題以及避免被輕易發現, 會直接通過syscall來呼叫

alarm也稱為鬧鐘函式,它可以在程序中設定乙個定時器,當定時器指定的時間到時,它向程序傳送sigalrm訊號。可以設定忽略或者不捕獲此訊號,如果採用預設方式其動作是終止呼叫該alarm函式的程序。

在逆向題目中通常僅僅是乙個小花招,如果時間設定的較短可能導致來不及附加,或比較麻煩

反制方法

patch

指標的逆向

指標操作技巧 1 運算時一定要先把位址存入指向單位元組指標中,這樣指標運算時的 1 2要取單位元組就將位址存入指向單位元組指標中,要取四位元組就將位址存入指向四位元組的指標中,之後用指標 0 輸出即可 3 指標的感覺 一級指標 存了變數 結構體的位址 onepoint 輸出變數 結構體的位址 one...

逆向筆記3 常見的逆向除錯方式

1.nop法 nop法通過用於跳過序列號驗證機制,得到最後的成功結果,關鍵是我們要找到序列號判定的函式,如何找到這個函式,常用的方法有以下幾個 1.利用字串查詢法,右鍵,查詢,引用的字串,查詢判斷失敗或者成功彈出的字串,從而向上,找到判定函式的位置,之後再跟進除錯。2.利用呼叫模組查詢法,右鍵,檢視...

逆向查詢 EXCEL 對資料的逆向查詢

立題簡介 內容 使用excel下的 vlookup 或 match index 函式實現逆向查詢 從右至左查詢 作用 使用excel下的 vlookup 及 match index 函式實現逆向查詢 從右至左查詢 環境 excel 2013 日期 2020 04 19 分割線 立題詳解 本次討論使用...