生活随笔
收集整理的這篇文章主要介紹了
REVERSE-PRACTICE-BUUCTF-10
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
REVERSE-PRACTICE-BUUCTF-10
- [GWCTF 2019]xxor
- [HDCTF2019]Maze
- [WUSTCTF2020]level2
- [BJDCTF2020]BJD hamburger competition
[GWCTF 2019]xxor
elf文件,無殼,用ida分析
main函數的邏輯清晰,首先獲取輸入,為6個int64的值,然后每2個值一組,調用sub_400686函數進行變換,變換后的值存儲到v11,最后驗證v11,驗證輸入
sub_400686函數,讀取每組的2個值,進行64次循環運算,變換后的值放回原位置
check函數,可以由此得到輸入經變換后需要變成的6個值
寫逆腳本,v11的6個值可以手動計算或者使用python的z3庫計算
v5類型為int32,初始值為0,64次加法必定超出了int32的最大正值,不過計算過程中會自動截取,于是不必特別考慮v5,正常寫腳本即可
#include<stdio.h>
__int64 v11
[] = { 0xdf48ef7e,0x20caacf4,0xe0f30fd5,0x5c50d8d6,0x9e1bde2d,0x84f30420 };
__int64 a2
[] = { 2,2,3,4 };
void main()
{for (int i
= 0; i
<= 4; i
+= 2){unsigned int v3
= v11
[i
];unsigned int v4
= v11
[i
+ 1];int v5
= 0;for (int j
= 0; j
<= 63; j
++)v5
+= 1166789954;for (int j
= 0; j
<= 63; j
++){v4
-= (v3
+ v5
+ 20) ^ ((v3
<< 6) + a2
[2]) ^ ((v3
>> 9) + a2
[3]) ^ 0x10;v3
-= (v4
+ v5
+ 11) ^ ((v4
<< 6) + a2
[0]) ^ ((v4
>> 9) + a2
[1]) ^ 0x20;v5
-= 1166789954;}if (v5
== 0){v11
[i
] = v3
;v11
[i
+ 1] = v4
;}}for (int i
= 0; i
< 6; i
++){printf("%ld,", v11
[i
]);}
}
運行結果
再用python的long_to_bytes轉成字符串
[HDCTF2019]Maze
exe程序,運行后提示通過迷宮獲得flag,有upx殼,脫殼后ida分析
main函數沒有被ida識別為函數,原因是代碼中添有花指令
jnz跳轉到下一條指令,不跳轉也是下一條指令,這里jnz阻礙了ida的識別,需要把jnz的整條指令nop掉
.text:0040102E處,call了一段紅色地址,說明該紅色地址并不存在于程序中,應該是在正確指令字節基礎上添加了幾個字節,變得不能被ida識別,于是需要去除多余的字節,選中紅色地址,按d轉換為數據,依次nop掉一些字節,看nop掉字節后ida是否能夠識別成代碼,發現轉為數據后,nop掉第一個字節,ida就可以識別了
去除花指令的效果
選中從main函數開始到結束retn指令之間的紅色.text代碼,按p生成函數,F5反編譯
分析main函數,wsad分別對應上下左右,初始位置為[7,0],結束位置為[5,-4]
在字符串窗口找到迷宮地圖,長度為70,猜測為10x7或者7x10,由初始位置和結束位置可知,地圖為7x10,即7行10列,起始點在“+”,終止點在“F”,走完迷宮即可得到flag
[WUSTCTF2020]level2
elf文件,有upx殼,脫殼后ida分析
左側函數窗口找到main函數,在IDA View-A窗口即可看到flag
[BJDCTF2020]BJD hamburger competition
unity游戲,老八秘制小漢堡,按正確的順序加料即可得到flag
BJD hamburger competition_Data->Managed->Assembly-CSharp.dll拖入dnSpy
找到主邏輯的部分
Md5方法對傳入的參數進行md5散列,大寫,取前20位
Sha1方法對傳入的參數進行sha1散列,大寫
Spawn方法對加料的順序進行驗證,選擇不同的配料對Init.secret(初始值為0)進行不同的運算,運算的結果進行sha1散列與已知值比較,相同時程序對運算的結果進行md5散列并輸出為flag
using System
;
using System
.Security
.Cryptography
;
using System
.Text
;
using UnityEngine
;
public class ButtonSpawnFruit : MonoBehaviour
{public static string Md5(string str
){byte[] bytes
= Encoding
.UTF8
.GetBytes(str
);byte[] array
= MD5
.Create().ComputeHash(bytes
);StringBuilder stringBuilder
= new StringBuilder();foreach (byte b
in array
){stringBuilder
.Append(b
.ToString("X2"));}return stringBuilder
.ToString().Substring(0, 20);}public static string Sha1(string str
){byte[] bytes
= Encoding
.UTF8
.GetBytes(str
);byte[] array
= SHA1
.Create().ComputeHash(bytes
);StringBuilder stringBuilder
= new StringBuilder();foreach (byte b
in array
){stringBuilder
.Append(b
.ToString("X2"));}return stringBuilder
.ToString();}public void Spawn(){FruitSpawner component
= GameObject
.FindWithTag("GameController").GetComponent<FruitSpawner>();if (component
){if (this.audioSources
.Length
!= 0){this.audioSources
[Random.Range(0, this.audioSources
.Length
)].Play();}component
.Spawn(this.toSpawn
);string name
= this.toSpawn
.name
;if (name
== "漢堡底" && Init
.spawnCount
== 0){Init
.secret
+= 997;}else if (name
== "鴨屁股"){Init
.secret
-= 127;}else if (name
== "胡羅貝"){Init
.secret
*= 3;}else if (name
== "臭豆腐"){Init
.secret
^= 18;}else if (name
== "俘虜"){Init
.secret
+= 29;}else if (name
== "白拆"){Init
.secret
-= 47;}else if (name
== "美汁汁"){Init
.secret
*= 5;}else if (name
== "檸檬"){Init
.secret
^= 87;}else if (name
== "漢堡頂" && Init
.spawnCount
== 5){Init
.secret
^= 127;string str
= Init
.secret
.ToString();if (ButtonSpawnFruit
.Sha1(str
) == "DD01903921EA24941C26A48F2CEC24E0BB0E8CC7"){this.result
= "BJDCTF{" + ButtonSpawnFruit
.Md5(str
) + "}";Debug
.Log(this.result
);}}Init
.spawnCount
++;Debug
.Log(Init
.secret
);Debug
.Log(Init
.spawnCount
);}}public GameObject toSpawn
;public int spawnCount
= 1;public AudioSource
[] audioSources
;public string result
= "";
}
使用在線網站可以解出已知sha1的原始值,為1001
再對1001進行md5,轉成大寫,取前20位,即可得到flag
如果不使用在線網站解sha1和md5散列,寫爆破腳本
import hashlib
for i
in range(7):for j
in range(7):for k
in range(7):for m
in range(7):secret
=997 if i
==0:secret
-=127elif i
==1:secret
*=3elif i
==2:secret
^=18elif i
==3:secret
+=29elif i
==4:secret
-=47elif i
==5:secret
*=5elif i
==6:secret
^=87if j
==0:secret
-=127elif j
==1:secret
*=3elif j
==2:secret
^=18elif j
==3:secret
+=29elif j
==4:secret
-=47elif j
==5:secret
*=5elif j
==6:secret
^=87if k
==0:secret
-=127elif k
==1:secret
*=3elif k
==2:secret
^=18elif k
==3:secret
+=29elif k
==4:secret
-=47elif k
==5:secret
*=5elif k
==6:secret
^=87if m
== 0:secret
-= 127elif m
== 1:secret
*= 3elif m
== 2:secret
^= 18elif m
== 3:secret
+= 29elif m
== 4:secret
-= 47elif m
== 5:secret
*= 5elif m
== 6:secret
^= 87secret
^=127 h
= hashlib
.sha1
()h
.update
(str(secret
).encode
(encoding
='utf-8'))if h
.hexdigest
() == "DD01903921EA24941C26A48F2CEC24E0BB0E8CC7".lower
():print(secret
)h2
= hashlib
.md5
()h2
.update
(str(secret
).encode
(encoding
='utf-8'))print(h2
.hexdigest
().upper
()[0:20])
運行結果
總結
以上是生活随笔為你收集整理的REVERSE-PRACTICE-BUUCTF-10的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。