【NPUCTF2020】EzReverse
一開始會有個簡單的花指令,去掉後才能對mainF5
對每個if語句進行分析( 結合動調 )後發現,有點像迷宮
v3是地圖,由數組大小可知地圖大小是7*7,若v3[i]是偶數則代表不能走的地方( 若走了直按failed ),反之是奇數就是可走的路,而終點在v3[48]
l:向右,h:向左,j:向上,k:向下
打印地圖,*代表可走,X代表不可走,終點是最後一個
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364#include <iostream>using namespace std;int main() { long long v3[49] = { 0 }; *v3 = 0xDFAE04FLL; v3[1] = 0x148983F2LL; v3[7] = 0x15B847LL; v3[2] = 0x69981A413ELL ...
【XNUCA2018】Code_Interpreter WriteUp
可以看出是一道虛擬機題,要求輸入3個整數,經encrypt()後再做對比
動調後可知input1~3的值不會被encrypt()修改
再分析encrypt()後,知其內部通過數組越界的方式對whereIsThisShit_進行操作,易知whereIsThisShit_最終需為0
先將程序流程打印出來
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129#include <iostream>#include <string>#include "defs ...
【NewStarCTF】逆向—week5
結束了呢
拔丝溜肆 (easy)拉入IDA,找到加密函數,發現是個魔改的base64,它在每次加密前先調用了change_table(),進入查看
根據隨機數來打亂base64的編碼表,而隨機數的亂數種已在main函數中給出,故可直接寫腳本解密
這base64解密腳本是我之前學base64時手寫的,寫的很爛,但能用就行
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192#include<iostream>#include<string>using namespace std;string codeTableForBase32And64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012 ...
【NewStarCTF】逆向—week4
太難啦 兩題沒做出來
Hash拉入IDA,找到加密函數
通過查詢各個API,得知是個sha加密,再根據傳入的參數可知每次加密3個字符,結果存放在v10中,長度為20
由於不太會python,所以只能用C++來寫爆破腳本( 正常用python來寫的話會簡單很多 )
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571 ...
【NewStarCTF】逆向—week3
這周考了挺多知識點的…
Zzzzzz3333這題明顯是在考z3求解器的應用,本人對此了解不多就不多BB了 )。附上我寫的腳本,z3的基本格式大致都是長這樣
123456789101112131415161718192021222324252627282930313233import z3s = z3.Solver()pwd = [z3.Int("pwd%d"%x) for x in range(8)]s.add(pwd[3] + 4 * pwd[2] + pwd[7] + 4 * (pwd[3] + 4 * pwd[2]) + 3 * (pwd[4] + 4 * pwd[0]) + 2 * (pwd[5] + 4 * pwd[6]) + 11 * pwd[1] == 6426)s.add(11 * (pwd[0] + pwd[7] + pwd[3]) + 4 * (pwd[5] + 2 * pwd[4]) + pwd[2] + 45 * pwd[1] + 7 * pwd[6] == 9801)s.add(5 * p ...
【NewStarCTF】逆向—week2
題目越來越難啦…
Likemyasp
看題目就知加了殼,但又找不到脫殼工具,只好自己手脫了( 瞎G8亂脫 )
64位程序,使用x64dbg來脫殼,先來到EP( 這個EP是加殼後的EP,而脫殼的目的是找到沒加殼時的OEP )
按ctrl+n,在VirtualProtect下斷點
然後按F9執行( 2次 ),發現總共會在VirtualProtect函數中斷下兩次
在第2次時,按alt+f9執行到返回,然後一直單步F8,直到看到如下圖的地方
綠框中的地方很像**main函數的參數( argv、argc ),因此這附近可能就存在我們想要的東西( 未必是OEP )**,單步F7進入紅框那個call
發現應該是找對了,下面也有提示成功or失敗的字串
然後直接用x64dbg自帶的Scylladump出來( 直接按Scylla中的dump就可以 )
注:這樣dump出來的文件並不能直接運行,但也可以在IDA中進行分析
將dump出來的exe拉入IDA,雖然會提示錯誤,但不要管繼續進入
在start函數中可以看到程序的加密邏輯( 下圖是我重命名後的結果,一開始IDA並不能識別出p ...
【NewStarCTF】逆向—week1
面向22級新生的題,難度友好,十分適合我這種菜G ( ̄▽ ̄)/
Hello_Reverse在main函數找到flag的一部分,然後按shift+f12找到另一部分
Baby_Re解法1先對用戶輸入進行異或加密,然後調用compare(s)函數進行比較
進入compare函數,發現只是一個直接比較
雙擊final可以看到密文,但其中4個字節的數據被交叉引用過,疑似被修改過,按x跟過去看看
發現它們被以下函數修改,而FunctionName這函數的調用時機在main之前
IDA導出數據的技巧:選中所需數據,按shift+e
編寫腳本解flag
12345678910111213141516#include<iostream>using namespace std;int main() { unsigned char final[] = { 0x66, 0x6D, 0x63, 0x64, 0x7F, 0x56, 54, 0x6A, 0x6D, 0x7D, 0x62, 58, 0x62, 0x6A, 0x51, 0x7D, 0x65, ...
【CSAW CTF Qualification Round 2022】逆向---部分WriteUp
Anya Gacha分析打開文件夾,發現是Unity遊戲
先打開遊戲看看是在干什麼
大概是一個抽卡遊戲,左上是金錢( 每次-10 ),按左下按鈕開始抽取
逆Unity遊戲通常可直接找到它的Assembly-CSharp.dll文件( 在\AnyaGacha_Data\Managed目錄下 ),將其拉入dnspy進行分析( 32位 )
在開始時對一些數據進行了初始化,這裡其中一個數據用了隨機數
找到按下【抽卡】按鈕所調用的函數
這裡首先判斷【金錢】是否>10,若是才能繼續
後面再對一些數據進行處理,然後調用this.Upload()
進入this.Upload(),看到它是通過發送網路請求來驗證
但我看不懂要怎樣才能走到this.succeed(text),而上面有提到一開始使用了隨機數來初始化數據,因此我猜測這可能與真的抽卡遊戲一樣,是概率問題
所以我的破解思路:不斷調用this.Upload(),直到成功為至
暴力破解在dnspy中,右鍵→Edit Method,修改wish函數
123456789public void wish() { ...
【FlareOn2】YUSoMeta WriteUp
題目:https://buuoj.cn/challenges#[FlareOn2]YUSoMeta
查殼使用ExeinfoPe查殼,發現是.net程序加了混淆,嘗試使用提示的.NET Generic unpacker的工具去除混淆,發現不行
拉入DIE,發現其所使用的混淆名為Smart Assembly,可使用de4dot工具來去除
使用de4dot去除混淆
下載地址:https://github.com/de4dot/de4dot
打開de4dot.netframework.sln,按如下設置,然後按生成
進入\Release\net45,可以看到de4dot.exe
使用指令de4dot.exe -d [path]來查看用了哪種混淆,確定了果真是SmartAssembly
使用指令de4dot.exe [path] -p sa來去除SmartAssembly混淆,反混淆後的檔案放在了原exe的目錄
選項說明-p sa:指定混淆類型,sa代表SmartAssembly
代碼分析
將反混淆後的程序拉入dnSpy進行分析
找到如下的關鍵地方,發現只要test == ...
OD插件——VS2019開發環境設置
OllyDbg Plugin SDK( 修改版 ):
sdkupdat.zip
設置步驟
添加資源
將上方SDK中的plugin.h和ollydbgvc7.lib拉到當前項目中
標頭檔→右鍵→加入→現有項目→選擇plugin.h
將ollydbgvc7.lib從VS2019中直接拖入,目錄大概長這樣:
VS2019設置
先創建一個Dll項目,然後把dllmain刪去
屬性→進階→字元集→多位元組
屬性→C/C++→所有選項→其他選項:/J ( 意思就是默認所有char都是unsigned char )
屬性→C/C++→先行編譯的標頭檔→未使用
調試相關為了方便調試,可將OD拖入當前項目中
設置Dll生成路徑:屬性→連結器→一般→輸出檔案→[OD插件目錄的路徑\]+dllName.dll ( 例如:C:\Users\MSI-PC\Desktop\A\逆向\MyFirstOdPluginSolution\MyFirstOdPlugin\Ollydbg\plugin\MyFirstDll.dll )
設置Dll調試:屬性→偵錯→命令:C:\Users\MSI-PC\Deskto ...