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