ワンベース
トピック ロジック
1. 入力文字列を受け入れます
2. encode1 暗号化
3. encode2 暗号化
4. 暗号化されたフラグを比較して、
encode1 が Caesar 暗号化であり、ディスプレイスメントが 3 で
あることを判断します encode2 は Base64 復号です。最初に Base64
復号
し、次に Caesar がwelcometotheworldofctfを取得します。
二.How to use python
1. プログラムロジックの解析
import base64
import hashlib
import sys
def abort():
print("Wrong flag!")
sys.exit(1)
print("Please input the flag:")
flag = input()
if len(flag) != 29:
abort()
if flag[:5] != 'Neepu':
abort()
if flag[16]!='a' or flag[17]!='_':
abort()
if flag[22]!=flag[17]:
abort()
if flag[28:] != '}':
abort()
if base64.b64encode(flag[-4:].encode()) != b'X2t1fQ==':
#_ku} 从倒数第四个字符开始切片,包括倒数第四个字符 base64解码即可
abort()
if flag[-2:-15:-3].encode().hex() != '75316c745f':
#u1lt_ 倒数第二个到倒数第15个,每隔3个取一次 十六进制转字符串即可
abort()
if sum(ord(x) * 10000 ** i for i, x in enumerate(flag[11:15][::-1])) !=110009500490115:
#下标11到14共4个字符爆破得到n_1s
abort()
if hashlib.md5(flag[9:3:-2].encode('utf-8')).hexdigest()!='db46a959e0f94c0a8977411ab69df11a':
#hy{ 下标九到三 查md5在线网站或者爆破都可以
abort()
if hashlib.sha1((flag[6]+flag[8]+flag[10]).encode()).hexdigest()!= 'dcb7ec019a90e41f85181ec9f1da642a8ced1b2d':
#Pt0 sha1爆破
abort()
if hashlib.sha256(flag.encode()).hexdigest() != 'a04f00829f27a5ead1c4ae526d6b1b0cec30ed0e56d6d71e9c001d7803e84892':
#sha256爆破
abort()
print("You are right!")
2. ブラストフラッグ[11]~フラッグ[14]
for a in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
for b in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
for c in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
for d in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
str=a+b+c+d
if(sum(ord(x)*10000**i for i,x in enumerate(str[::-1]))==110009500490115):
print(str)#n_1s
3.爆破sha1
md5 オンライン復号化 Web サイト: https://www.bejson.com/enc/md5dsc/自己復号化
sha1 ブラスト
hashcat -a 3 -m 100 dcb7ec019a90e41f85181ec9f1da642a8ced1b2d ?a?a?a
4.sha256 マスクブラスト
最終的に結合されたマスク Neepu{Pyth0n_1s_a_t?a?al?a?a1_ku}
hashcat -a 3 -m 1400 a04f00829f27a5ead1c4ae526d6b1b0cec30ed0e56d6d71e9c001d7803e84892 Neepu{Pyth0n_1s_a_t?a?al?a?a1_ku}
またはブラストスクリプトを使用する
import hashlib
string='Neepu{Pyth0n_1s_a_t??l??1_ku}'
for a in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
for b in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
for c in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
for d in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_":
string_try = string.replace('?', a, 1).replace('?', b, 1).replace('?', c, 1).replace('?', d, 1)
hash_object = hashlib.sha256(string_try.encode())
hex_dig = hash_object.hexdigest()
if(hex_dig=='a04f00829f27a5ead1c4ae526d6b1b0cec30ed0e56d6d71e9c001d7803e84892'):
print(string_try)
3. IKUNチェッカー
1. 番組情報を見る
C# で書かれていることがわかります。dnSpy を使用して
dnSpy プロジェクトのアドレスを分析します: https://github.com/dnSpy/dnSpy
2. プログラムロジックを解析する
dnSpy でプログラムを開いた後、From1 をクリックすると、check1 ~ check5 関数の
ヒントが表示されます。上記の検索機能を使用して、キー文字列を検索して見つけることができます。
3. button1_conClick関数
フラグの判定が行われ、フラグのさまざまな部分が傍受され、さまざまなチェック関数が呼び出され、最後に暗号化された結果が結合されて出力されることがわかります。
4.check1機能
md5暗号化、復号化して1998-8-2を取得
5.check2機能
check2はsha1です
wp を参照するのは非常に奇妙です: Neepu Re Writeupによると、sha1 も md5 であり、実際に復号化できるとのことです。Jinitaimeiが
確認しましたが、理由がわかりませんでした。知っている人がいたら、教えてください。
6.check3機能
文字列が 2 つあるため、「-」が 2 つあることに注意してください。
7.check4機能
AES 暗号化
テキストが暗号文、バイトがキーで、モードが ECB、PaddingMode が PKCS7 であることがわかります。暗号化ツールボックスを使用して、 xiaoheizishiba
を解決できます。
8.check5機能
sha256、つまり、ハッシュのために上記で得られた結果を結合します (検証を通じてフラグを取得するプログラムを実行することもできます) スプライシング結果: 1998-8-2
- jinitaimei-xiaoheizishiba
sha256: b8688fc33b5786095dc70a34ad14b9623905185663fa26dcc75d3b6b1f699
99 フラグ:ニープ{b8688fc33b5786095dc70a34ad14b9623905185663fa26dcc75d3b6b1f69999e}
4. ジャンクコード
プログラムはフラグを与えているようですが、出力速度が非常に遅いです
1. 32 ビット動的デバッグ ツールを使用してデバッグします。
32 ビット デバッグ ツールを使用してデバッグできます。
開いたら、F9 キーを押してプログラムを実行し、右クリックして文字列を見つけます。
フラグNeepu{it-1s-not-junk-code- を直接見つけることができます。 1u-1u-the-qq-bin-mat}
2.CheatEngineを使用する
プロセスをアタッチするには、検索文字列を選択し、Neepu { を検索します。
次に、アドレスを右クリックして、関連するメモリ領域を参照することを選択すると、 Neepu{it-1s-not-junk-code-1u-1u-the-qq-bin-mat}
フラグが表示されます。
5. ストレンジエルフ
この質問は追加のデバッグを添付して行われていませんでした
1. 砲撃
upx -d 移動
2. 関数ロジック
mov の混乱、同様の質問がありますmovfuscator の混乱 - re5-packed-movement は
mov の混乱の原理について非常に優れています。ここにいくつかの推奨記事があります。
git のダウンロードが非常に遅いため、難読化対策環境が準備できていません。ここでは、検索を使用してマシン コードを検索し、直接取得できます。
6.Xor
この質問は go 言語の逆です 一部の関数は ida8.2 を使用すると解析できます 下位バージョンの解析結果は醜いです
IDA8.2FreeWare のダウンロード アドレス: IDA Freeware Download Page
1. メイン関数を見つけます
入力後、main 関数が見つからないことがわかりました。この質問を見つけるには 2 つの方法があります。
まず、プログラムを実行すると、出力が表示されます。フラグを入力してください。
その後、文字列参照に従って検索できます。クロス2番目の
方法は、フラグを入力する必要があるため、scan 関数を検索し、Fscanln の相互参照を調べることができ、
main 関数を見つけて、下から見ることによるキー論理 XOR
2. プログラムロジック
ここで、v17 は毎回 4 以上かどうかを判定し、v17 をオフセットとして qwer 内の文字を検索するため、
qwer[i%4 と同様の関数であると推測できます。 ] を実行し、データと XOR します (確かに、リバースは推測に依存する必要があります)。
3. 問題解決スクリプト
ここでの落とし穴は、ida8.2 フリーウェアでは idapython スクリプトを作成できないことです。idapro7.7 を使用して、8.2 で分析したばかりのデータベース ファイルを開き、動的デバッグ用のブレークポイントを設定
します (v25 暗号文の値は静的に表示できません)。
v25 をフォローアップしてアドレスを表示します (または、rsp、rbp に対する相対的なオフセットに基づいてアドレスを計算します)
idapython スクリプトを使用してフラグを出力します (idapython スクリプトの基本的な操作を簡単にまとめました。この質問にはこれで十分です) : IDAPython 入門の基本文法)
flag:Neepu{X0r_is_easy_1234123412345}
7. 参考資料:
- ニープ再書き込み
- NEEPUCTF 2023 公式記事 (Neepu グループで入手可能)