Simple Reverse - 0x15(2023 HW - crackme_vectorization)
Source Code
:::spoiler IDA Main Function
1 |
|
::: :::spoiler IDA Ugly Function
1 |
|
:::
Recon
一陣基本操作處理完比較好看的狀態後,首先發現一開始先輸入字串的長度(應該是49),然後我們要輸入一些東西(就是按照前面輸入,總共也是49次),接著就會進到很醜沒辦法解析的function(我暫時不理他),一開始我在猜應該是做encryption之類的事情,接著就比對mem,一樣就噴correct這樣,我認為超級醜的function應該不是這次出題的重點,因為要全部逆完真的很有難度,對於學習也沒必要,此時我開始用動態+通靈的方式猜他在幹嘛,依照題目的標題和後面對比字串長度必須要等於7
這兩個東西判斷,他應該是在做矩陣之類的操作,而那個醜不拉基的function應該是類似乘法或是加法之類的功能,有了想法就可以實驗他的操作
如果輸入長度49
- 內容都是零,毫不意外經過醜不拉基function後都會是零
:::spoiler Result
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
250x000055aa2b46b4b0│+0x0000: 0x0000000000000000 ← $rdi 0x000055aa2b46b4b8│+0x0008: 0x0000000000000000 0x000055aa2b46b4c0│+0x0010: 0x0000000000000000 0x000055aa2b46b4c8│+0x0018: 0x0000000000000000 0x000055aa2b46b4d0│+0x0020: 0x0000000000000000 0x000055aa2b46b4d8│+0x0028: 0x0000000000000000 0x000055aa2b46b4e0│+0x0030: 0x0000000000000000 0x000055aa2b46b4e8│+0x0038: 0x0000000000000000 0x000055aa2b46b4f0│+0x0040: 0x0000000000000000 0x000055aa2b46b4f8│+0x0048: 0x0000000000000000 0x000055aa2b46b500│+0x0050: 0x0000000000000000 0x000055aa2b46b508│+0x0058: 0x0000000000000000 0x000055aa2b46b510│+0x0060: 0x0000000000000000 0x000055aa2b46b518│+0x0068: 0x0000000000000000 0x000055aa2b46b520│+0x0070: 0x0000000000000000 0x000055aa2b46b528│+0x0078: 0x0000000000000000 0x000055aa2b46b530│+0x0080: 0x0000000000000000 0x000055aa2b46b538│+0x0088: 0x0000000000000000 0x000055aa2b46b540│+0x0090: 0x0000000000000000 0x000055aa2b46b548│+0x0098: 0x0000000000000000 0x000055aa2b46b550│+0x00a0: 0x0000000000000000 0x000055aa2b46b558│+0x00a8: 0x0000000000000000 0x000055aa2b46b560│+0x00b0: 0x0000000000000000 0x000055aa2b46b568│+0x00b8: 0x0000000000000000 0x000055aa2b46b570│+0x00c0: 0x0000000000000000
:::
- 內容都是一,經過醜不拉基function後都會每七個都是同一個數字
:::spoiler Result
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
250x000055d2f80754b0│+0x0000: 0x000003d4000003d4 ← $rdi 0x000055d2f80754b8│+0x0008: 0x000003d4000003d4 0x000055d2f80754c0│+0x0010: 0x000003d4000003d4 0x000055d2f80754c8│+0x0018: 0x000002d8000003d4 0x000055d2f80754d0│+0x0020: 0x000002d8000002d8 0x000055d2f80754d8│+0x0028: 0x000002d8000002d8 0x000055d2f80754e0│+0x0030: 0x000002d8000002d8 0x000055d2f80754e8│+0x0038: 0x0000030f0000030f 0x000055d2f80754f0│+0x0040: 0x0000030f0000030f 0x000055d2f80754f8│+0x0048: 0x0000030f0000030f 0x000055d2f8075500│+0x0050: 0x000003000000030f 0x000055d2f8075508│+0x0058: 0x0000030000000300 0x000055d2f8075510│+0x0060: 0x0000030000000300 0x000055d2f8075518│+0x0068: 0x0000030000000300 0x000055d2f8075520│+0x0070: 0x000003b0000003b0 0x000055d2f8075528│+0x0078: 0x000003b0000003b0 0x000055d2f8075530│+0x0080: 0x000003b0000003b0 0x000055d2f8075538│+0x0088: 0x000003c6000003b0 0x000055d2f8075540│+0x0090: 0x000003c6000003c6 0x000055d2f8075548│+0x0098: 0x000003c6000003c6 0x000055d2f8075550│+0x00a0: 0x000003c6000003c6 0x000055d2f8075558│+0x00a8: 0x0000031e0000031e 0x000055d2f8075560│+0x00b0: 0x0000031e0000031e 0x000055d2f8075568│+0x00b8: 0x0000031e0000031e 0x000055d2f8075570│+0x00c0: 0x000000000000031e
:::
- 內容都是二,和上面對比全部都會是兩倍
:::spoiler Result
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
250x0000563c09e664b0│+0x0000: 0x000007a8000007a8 ← $rdi 0x0000563c09e664b8│+0x0008: 0x000007a8000007a8 0x0000563c09e664c0│+0x0010: 0x000007a8000007a8 0x0000563c09e664c8│+0x0018: 0x000005b0000007a8 0x0000563c09e664d0│+0x0020: 0x000005b0000005b0 0x0000563c09e664d8│+0x0028: 0x000005b0000005b0 0x0000563c09e664e0│+0x0030: 0x000005b0000005b0 0x0000563c09e664e8│+0x0038: 0x0000061e0000061e 0x0000563c09e664f0│+0x0040: 0x0000061e0000061e 0x0000563c09e664f8│+0x0048: 0x0000061e0000061e 0x0000563c09e66500│+0x0050: 0x000006000000061e 0x0000563c09e66508│+0x0058: 0x0000060000000600 0x0000563c09e66510│+0x0060: 0x0000060000000600 0x0000563c09e66518│+0x0068: 0x0000060000000600 0x0000563c09e66520│+0x0070: 0x0000076000000760 0x0000563c09e66528│+0x0078: 0x0000076000000760 0x0000563c09e66530│+0x0080: 0x0000076000000760 0x0000563c09e66538│+0x0088: 0x0000078c00000760 0x0000563c09e66540│+0x0090: 0x0000078c0000078c 0x0000563c09e66548│+0x0098: 0x0000078c0000078c 0x0000563c09e66550│+0x00a0: 0x0000078c0000078c 0x0000563c09e66558│+0x00a8: 0x0000063c0000063c 0x0000563c09e66560│+0x00b0: 0x0000063c0000063c 0x0000563c09e66568│+0x00b8: 0x0000063c0000063c 0x0000563c09e66570│+0x00c0: 0x000000000000063c
:::
- 只有第一個element是1,其他都是零,由結果可知只有七個一數的第一個element會有值,且該值是已經從儲存在原本的執行檔中,比對之後發現一模一樣
:::spoiler Result
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
250x0000563dd53444b0│+0x0000: 0x000000000000003c ("<"?) ← $rdi 0x0000563dd53444b8│+0x0008: 0x0000000000000000 0x0000563dd53444c0│+0x0010: 0x0000000000000000 0x0000563dd53444c8│+0x0018: 0x0000007300000000 0x0000563dd53444d0│+0x0020: 0x0000000000000000 0x0000563dd53444d8│+0x0028: 0x0000000000000000 0x0000563dd53444e0│+0x0030: 0x0000000000000000 0x0000563dd53444e8│+0x0038: 0x000000000000007a ("z"?) 0x0000563dd53444f0│+0x0040: 0x0000000000000000 0x0000563dd53444f8│+0x0048: 0x0000000000000000 0x0000563dd5344500│+0x0050: 0x0000004100000000 0x0000563dd5344508│+0x0058: 0x0000000000000000 0x0000563dd5344510│+0x0060: 0x0000000000000000 0x0000563dd5344518│+0x0068: 0x0000000000000000 0x0000563dd5344520│+0x0070: 0x0000000000000067 ("g"?) 0x0000563dd5344528│+0x0078: 0x0000000000000000 0x0000563dd5344530│+0x0080: 0x0000000000000000 0x0000563dd5344538│+0x0088: 0x0000007900000000 0x0000563dd5344540│+0x0090: 0x0000000000000000 0x0000563dd5344548│+0x0098: 0x0000000000000000 0x0000563dd5344550│+0x00a0: 0x0000000000000000 0x0000563dd5344558│+0x00a8: 0x00000000000000fa 0x0000563dd5344560│+0x00b0: 0x0000000000000000 0x0000563dd5344568│+0x00b8: 0x0000000000000000 0x0000563dd5344570│+0x00c0: 0x0000000000000000
:::
由以上實驗可以大致確認醜不拉基function做的事情就是矩陣乘法,而我們知道他比較的乘法結果,也知道和我們輸入的矩陣相乘的乘數,換言之可以反推回我們應該輸入的東西為何
Exploit
1 |
|
1 |
|
最後只要把解出來的東西丟回去revguard就可以拿到真正的flag了
Flag: FLAG{yOu_kn0w_hOw_to_r3v3r53_4_m47riX!}