wasm逆向——(极客大挑战2021wasm
?WebAssembly是一種全新的Web編程語言,但是與JavaScript不同,它不是一種讓你直接手動編寫的語言,而是C / C ++,Rust,C#和TypeScript等不斷增加的上層語言的編譯目標。
wasm是基于堆棧的虛擬機的二進制指令格式
wabt包安裝
嘗試了gitclone的方法,一直沒安裝成功,嘗試:
sudo apt install wabt
我的環(huán)境:ubuntu20.4
WABT(我們將其稱為“ wabbit”)是用于WebAssembly的一套工具,包括:
- wat2wasm:從WebAssembly文本格式轉(zhuǎn)換為?WebAssembly二進制格式
- wasm2wat:?wat2wasm的逆函數(shù),從二進制格式轉(zhuǎn)換回文本格式(也稱為.wat)
- wasm-objdump:顯示有關(guān)wasm二進制文件的信息。與objdump類似。
- wasm-interp:使用基于堆棧的解釋器解碼并運行WebAssembly二進制文件
- wasm-decompile:將wasm二進制文件反編譯為可讀的類似C的語法。
- wat-?desugar:解析規(guī)范解釋程序支持的.wat文本格式(S表達式,平面語法或混合格式)并打印“規(guī)范”平面格式
- wasm2c:將WebAssembly二進制文件轉(zhuǎn)換為C源代碼和標頭
- wasm-strip:刪除WebAssembly二進制文件的部分
- wasm-validate:驗證WebAssembly二進制格式的文件
- wast2json:將wasm spec測試格式的文件轉(zhuǎn)換為JSON文件和關(guān)聯(lián)的wasm二進制文件
- wasm-opcodecnt:計算指令的操作碼使用量
- spectest-interp:讀取Spectest JSON文件,然后在解釋器中運行其測
?
?打開壓縮包,是三個這個文件
1. 靜態(tài)分析:
?①反匯編:
wasm2wat xorwasm.wasm -o xorwasm.wat
?把wasm文件轉(zhuǎn)換成webassmebly文件。
②反編譯:
wasm2c xorwasm.wasm -o xorwasm.c
但是這樣得到的.c代碼與wasm的匯編代碼沒有什么區(qū)別,只是省略了?些出?棧的操作
③重新編譯后?ida反編譯進?優(yōu)化:
之前我們得到的.c?件也是?法分析的,我們可以?gcc 編譯.c?件,然后? IDA 分析輸出?件
?先我們要先將wabt/wasm2c?件夾下的wasm-rt.h和wasm-rt-impl.h頭?件移動到我們反編譯出來的.c和.h?件夾下
?gcc編譯,直接gcc wasm.c會報錯,因為很多wasm的函數(shù)沒有具體的實現(xiàn)。但是我們可以只編譯不鏈接,我們關(guān)?的只是程序 本?的邏輯,不需要真正編譯出能運?的elf來
gcc -c xorwasm.c -o xorwasm.o
由于我沒有使用clone我是去官網(wǎng)?上拷貝下wasm-rt.h和wasm-rt-impl.h到虛擬機中再執(zhí)行
得到 xorwasm.o,放入64位IDApro
④關(guān)鍵函數(shù)分析:
?if函數(shù)判斷棧內(nèi)空間,我們來看一下f11函數(shù)
幾點特殊說明:f**函數(shù)一般是基本函數(shù),print,scanf,strlen之類的
根據(jù)第一個參數(shù)猜測功能 0x400的偏移都對應常量開頭,第一個參數(shù)的值減去0x400,再加上下面的基地址,就是函數(shù)所用的常量
?下面我們加載看一下加密函數(shù)f10.
?
?很簡單寫腳本
a=[0x35, 0x3F, 0x25, 0x1D, 0x11, 0x07, 0x15, 0x0B, 0x39, 0x2F,0x15, 0x39, 0x35, 0x56, 0x39, 0x21, 0x09, 0x56, 0x02, 0x47,0x47, 0x1B] for i in range(len(a)):print(chr(a[i]^ord('f')),end='')flag:SYC{wasm_Is_S0_Go0d!!}
總結(jié):wasm逆向第一次接觸,主要是看懂函數(shù)。。。
二:動態(tài)調(diào)試
我使用的是windos自帶的msedge瀏覽器.
雙擊.html文件毫無收獲?
?這樣是沒有正確運?起來的,?先要在對應?件夾開?個簡易服務(wù)器,才能正確的運? ?先cd進對應?錄 然后使?python創(chuàng)建?個簡易的本地局域?
python -m http.server -b localhost
之后便可以直接?瀏覽器訪問:?
http://localhost:800
0/xorwasm.html
?
?提示輸入flag,隨機輸入
可以看?驗證失敗 接下來我們逐漸跟進去進?調(diào)試 F12打開調(diào)試器 打開wasm文件
?ctrl+f 查找main函數(shù)
點擊地址欄下好我們的斷點
然后刷新,可以看?被斷下
F8執(zhí)?(等價于IDA的F9),F10單步步過,F11單步步? 然后跟進func11直到要求我們輸?flag 查看內(nèi)存的?法
?點擊memory右上角的圖標
?輸入要想查詢的值
執(zhí)行完func96屏幕出現(xiàn)
?
?猜測為輸出函數(shù)
執(zhí)行到func17 查詢1084的值
?
為%猜測是輸入函數(shù)。
?
這?判斷我們輸?的字符串的?度,然后將?度存放到了var22中?
?判斷長度是否等于二十二不等于執(zhí)行這個
我們再次輸入一個22長度的
跟進f10
?
發(fā)現(xiàn)關(guān)鍵異或,就是將我們輸?的字符串取出和const 102進?異或之后再存放回去 加密之后返回?
?跟進到f9
var2存放的是我們的?較數(shù)據(jù)的地址 將?較數(shù)據(jù)取出寫出解題腳本即可?
?
a=[0x35, 0x3F, 0x25, 0x1D, 0x11, 0x07, 0x15, 0x0B, 0x39, 0x2F,0x15, 0x39, 0x35, 0x56, 0x39, 0x21, 0x09, 0x56, 0x02, 0x47,0x47, 0x1B] for i in range(len(a)):print(chr(a[i]^ord('f')),end='')flag:SYC{wasm_Is_S0_Go0d!!}
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的wasm逆向——(极客大挑战2021wasm的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BUU--[MRCTF2020]Pixe
- 下一篇: 公钥密码体制(RSA,椭圆曲线密码,El