逆向查找_CTFer成长之路--一道数独逆向题目解题过程(算法分析、查找线索)...
前言
CTF 是實戰性很強的賽事。僅學習理論知識,不進行實操,永遠無法成為 CTF 大神。本次博客為大家解讀一道數獨相關的逆向,講解解題過程,總結知識點(CTF中的套路)。
題目介紹
本次選擇的是出自2017年全國大學生信息安全競賽的一道逆向題,題目分值200分,主要考察算法分析、腦洞、數獨知識等內容。(為啥說考察數獨知識呢,因為你在分析時如果想到了有可能是數獨,你會解題飛快。)
準備工具
解題過程
虛擬機中,直接運行程序,一頓猛輸入,直接提示 fail!后程序退出。
2. 使用 ExeinfoPe 查看軟件信息
發現沒有殼,開心一下。 是一個32位程序。
3. IDA查看軟件信息
直接拖入到 IDA中查看。在函數窗口看到main函數,直接點開后,按下 F5,偽代碼如下:
4. 分析算法
在偽代碼22行、23行發現有一個類,名叫 Sudu。 22行 初始化這個類。23行,Sudu::set_data,按名字理解是設置這個類的內部數據。具體設置什么數據還不知道。
如果要想得到 "success" 滿足的 兩個條件分別是 Sudo::check()函數要通過 , set_sudu()這個函數的返回值要為0。
點擊進入 Sudu::set_data函數查看。從 第二個參數的地址,初始化一個9*9的數組。到這里如果能猜出是數獨的是大神(逃跑)。
直接進入OD動態調試。發現初始化后的地址,數據如下:
從地址可以看到,所有數組使用了小端模式存儲了。恢復數據后,是以下數獨。
[0, 0, 7, 5, 0, 0, 0, 6, 0]
[0, 2, 0, 0, 1, 0, 0, 0, 7]
[9, 0, 0, 0, 3, 0, 4, 0, 0]
[2, 0, 1, 0, 0, 0, 0, 0, 0]
[0, 3, 0, 1, 0, 0, 0, 0, 5]
[0, 0, 0, 0, 0, 0, 7, 1, 0]
[4, 0, 0, 0, 0, 8, 2, 0, 0]
[0, 0, 5, 9, 0, 0, 0, 8, 0]
[0, 8, 0, 0, 0, 1, 0, 0, 3]
5. 直接用網站解題。
在線解數獨的網站比較多,我們選了一個,https://shudu.gwalker.cn/
將上面數獨輸入進去。可以解出來。
6. 輸入數獨,獲得flag
將網站解出來的數獨,按順序輸入到命令行窗口。輸入時,我們計算出來的填寫數字。原先有數值的,用0替代。
輸入值:340089102508406930016207058060875349709064820854392006093650071170023604602740590
flag 就是要輸入的數組。
主要知識點
1.小段模式和大段模式
什么是大端什么是小端? 數據 在內存中的表達方式有兩種。以數據 0x12 34 56 78為例,
在本模式下,將高位字節排放在內存中的低地址段,低位字節安排在內存中的高地址端。
這種模式和我們的直觀理解是一樣的。
低地址 --------------------> 高地址 0x12 | 0x34 | 0x56 | 0x78
在本模式下,低位字節排放在內存中的低地址端,高位字節排放在內存中的高地址端。
低地址 --------------------> 高地址 0x78 | 0x56 | 0x34 | 0x12
在參考文獻中對于大小端有個詳細的描述,感興趣的讀者可以看一下。通常 arm、DSP大多采用小端模式。
寫在結尾
這道是一個典型的技巧性比較強的題目。如果你的思維靈活或者敢于大膽猜測說不定能拿到第一滴血。
參考:
1.https://www.cnblogs.com/little-white/p/3236548.html
總結
以上是生活随笔為你收集整理的逆向查找_CTFer成长之路--一道数独逆向题目解题过程(算法分析、查找线索)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git 删除tag_Git 基本应用
- 下一篇: arthas 查看哪个方法调用最耗时_A