DarkCTF Writeup

この大会は2020/9/25 12:00(JST)~2020/9/27 12:00(JST)に開催されました。
今回もチームで参戦。結果は13094点で808チーム中16位でした。
自分で解けた問題をWriteupとして書いておきます。

Source (Web)

User-Agentが数値で、4バイト未満、10000より大きい数値の場合、フラグが表示される。eを使ってべき乗を示すことによって条件を満たす。

$ curl -H "User-Agent: 9e9" http://web.darkarmy.xyz
<html>
    <head>
        <title>SOURCE</title>
        <style>
            #main {
    height: 100vh;
}
        </style>
    </head>
    <body><center>
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
<div class="w3-panel w3-green"><h3>Correct</h3>
  <p>darkCTF{changeing_http_user_agent_is_easy}</p></div></center>
<!-- Source is helpful -->
    </body>
</html>
darkCTF{changeing_http_user_agent_is_easy}

linux starter (Linux)

ただ、ディレクトリを移動し、flag.txtファイルを見るだけ。

$ ssh wolfie@linuxstarter.darkarmy.xyz -p 8001
The authenticity of host '[linuxstarter.darkarmy.xyz]:8001 ([52.66.238.72]:8001)' can't be established.
ECDSA key fingerprint is SHA256:c89dVKmOwWcuk3nhpaDFytMNR3U8Ph44wwIjTm8VECY.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[linuxstarter.darkarmy.xyz]:8001,[52.66.238.72]:8001' (ECDSA) to the list of known hosts.
Password: 
Welcome to Ubuntu 16.04.7 LTS (GNU/Linux 5.4.0-1024-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
                                                                                                                                            
                                                                                                                                            
DDDDDDDDDDDDD                                           kkkkkkkk                  CCCCCCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTFFFFFFFFFFFFFFFFFFFFFF
D::::::::::::DDD                                        k::::::k               CCC::::::::::::CT:::::::::::::::::::::TF::::::::::::::::::::F
D:::::::::::::::DD                                      k::::::k             CC:::::::::::::::CT:::::::::::::::::::::TF::::::::::::::::::::F
DDD:::::DDDDD:::::D                                     k::::::k            C:::::CCCCCCCC::::CT:::::TT:::::::TT:::::TFF::::::FFFFFFFFF::::F
  D:::::D    D:::::D  aaaaaaaaaaaaa  rrrrr   rrrrrrrrr   k:::::k    kkkkkkkC:::::C       CCCCCCTTTTTT  T:::::T  TTTTTT  F:::::F       FFFFFF
  D:::::D     D:::::D a::::::::::::a r::::rrr:::::::::r  k:::::k   k:::::kC:::::C                      T:::::T          F:::::F             
  D:::::D     D:::::D aaaaaaaaa:::::ar:::::::::::::::::r k:::::k  k:::::k C:::::C                      T:::::T          F::::::FFFFFFFFFF   
  D:::::D     D:::::D          a::::arr::::::rrrrr::::::rk:::::k k:::::k  C:::::C                      T:::::T          F:::::::::::::::F   
  D:::::D     D:::::D   aaaaaaa:::::a r:::::r     r:::::rk::::::k:::::k   C:::::C                      T:::::T          F:::::::::::::::F   
  D:::::D     D:::::D aa::::::::::::a r:::::r     rrrrrrrk:::::::::::k    C:::::C                      T:::::T          F::::::FFFFFFFFFF   
  D:::::D     D:::::Da::::aaaa::::::a r:::::r            k:::::::::::k    C:::::C                      T:::::T          F:::::F             
  D:::::D    D:::::Da::::a    a:::::a r:::::r            k::::::k:::::k    C:::::C       CCCCCC        T:::::T          F:::::F             
DDD:::::DDDDD:::::D a::::a    a:::::a r:::::r           k::::::k k:::::k    C:::::CCCCCCCC::::C      TT:::::::TT      FF:::::::FF           
D:::::::::::::::DD  a:::::aaaa::::::a r:::::r           k::::::k  k:::::k    CC:::::::::::::::C      T:::::::::T      F::::::::FF           
D::::::::::::DDD     a::::::::::aa:::ar:::::r           k::::::k   k:::::k     CCC::::::::::::C      T:::::::::T      F::::::::FF           
DDDDDDDDDDDDD         aaaaaaaaaa  aaaarrrrrrr           kkkkkkkk    kkkkkkk       CCCCCCCCCCCCC      TTTTTTTTTTT      FFFFFFFFFFF           
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            
                                                                                                                                       Created BY: White_WOlf#1337     
Last login: Sat Sep 26 08:14:23 2020 from 95.5.201.212
wolfie@9ad161dbc9ce:~$ ls
bin  imp
wolfie@9ad161dbc9ce:~$ cd imp
wolfie@9ad161dbc9ce:~/imp$ ls
flag.txt
wolfie@9ad161dbc9ce:~/imp$ cat flag.txt
darkCTF{h0pe_y0u_used_intended_w4y}
darkCTF{h0pe_y0u_used_intended_w4y}

Simple_SQL (Web)

HTMLソースを見ると、コメントにこう書いてある。

<!-- Try id as parameter  --> 

id=0から順に試す。http://simplesql.darkarmy.xyz/?id=9にアクセスしたときにフラグが表示された。

Username : flag Password : darkCTF{it_is_very_easy_to_find}
darkCTF{it_is_very_easy_to_find}

haxXor (Cryptography)

フラグは"darkCTF{"から始まることを前提にXOR鍵を求め、復号する。

ct = '5552415c2b3525105a4657071b3e0b5f494b034515'.decode('hex')

pre_flag = 'darkCTF{'
key = ''
for i in range(len(pre_flag)):
    key += chr(ord(pre_flag[i]) ^ ord(ct[i]))

flag = ''
for i in range(len(ct)):
    code = ord(ct[i]) ^ ord(key[i%len(key)])
    flag += chr(code)
print flag
darkCTF{kud0s_h4xx0r}

Pipe Rhyme (Cryptography)

RSA暗号。nを素因数分解する。

n = 31415926535897932384626433832795028841 * 56129192858827520816193436882886842322337671

あとはそのまま復号する。

from Crypto.Util.number import *

N = 0x3b7c97ceb5f01f8d2095578d561cad0f22bf0e9c94eb35a9c41028247a201a6db95f
e = 0x10001
ct = 0x1B5358AD42B79E0471A9A8C84F5F8B947BA9CB996FA37B044F81E400F883A309B886

p = 31415926535897932384626433832795028841
q = 56129192858827520816193436882886842322337671
phi = (p - 1) * (q - 1)
d = inverse(e, phi)
m = pow(ct, d, N)
flag = long_to_bytes(m)
print flag
darkCTF{4v0iD_us1ngg_p1_pr1mes}

WEIRD ENCRYPTION (Cryptography)

16で割った商とあまりの組み合わせで暗号化しているため、逆算が可能。"c"と"cr"の区別には注意が必要。

main_string = 'c an u br ea k th is we ir d en cr yp ti on'.split()

with open('Encrypted', 'r') as f:
    enc = f.read().rstrip()

hex_msg = ''
tmp = ''
for i in range(len(enc)):
    tmp += enc[i]
    if tmp in main_string:
        if tmp == 'c' and enc[i+1] == 'r':
            pass
        else:
            hex_msg += hex(main_string.index(tmp))[2:]
            tmp = ''

clear_text = hex_msg.decode('hex')
print clear_text

復号結果は以下の通り。

Hello. Your flag is DarkCTF{0k@y_7h15_71m3_Y0u_N33d_70_Br3@k_M3}.
DarkCTF{0k@y_7h15_71m3_Y0u_N33d_70_Br3@k_M3}

Easy RSA (Cryptography)

nは不明だが、nが非常に大きく、eが小さいケースと判断し、Low Public Exponent Attackで復号する。

import gmpy
from Crypto.Util.number import *

e = 3
cipher = 70415348471515884675510268802189400768477829374583037309996882626710413688161405504039679028278362475978212535629814001515318823882546599246773409243791879010863589636128956717823438704956995941

m = gmpy.root(cipher, e)[0]
flag = long_to_bytes(m)
print flag
darkCTF{5m4111111_3_4tw_xD}

TRICKY BIT (Forensics)

ステガノグラフィの処理概要は以下の通り。

・オリジナルBMPファイル読み込み
・読み込んだファイルのヘッダサイズ分、新BMP用にセット
・隠し文字列のサイズの後に"$"を結合(A)
・(A)について埋め込み
 ・2進数にして各ビットごとにオリジナルBMPのLSBに埋め込み
・隠し文字列について埋め込み
 ・2進数にして各ビットごとにオリジナルBMPのLSBに埋め込み
・以降はオリジナルBMPの同じ箇所以降のデータを結合

このことを元にバイナリファイルのLSBからフラグを復元する。

HEADER_SIZE = 54
DELIMITER = '$'

with open('lsb1.bmp', 'rb') as f:
    stego_image = f.read()

counter = HEADER_SIZE

size_data = ''
while True:
    bin_data = ''
    for i in range(8):
        bin_data += str(ord(stego_image[counter]) & 1)
        counter += 1
    c = chr(int(bin_data, 2))
    size_data += c
    if c == DELIMITER:
        break

print '[+] hidden size data:', size_data
size = int(size_data[:-1])

flag = ''
for j in range(size):
    bin_data = ''
    for i in range(8):
        bin_data += str(ord(stego_image[counter]) & 1)
        counter += 1
    c = chr(int(bin_data, 2))
    flag += c

print flag

実行結果は以下の通り。

[+] hidden size data: 37$
DarkCTF{7H!5_0n3_was_4_l!ttl3_TRICKY}
DarkCTF{7H!5_0n3_was_4_l!ttl3_TRICKY}

Feedback (Feedback)

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

darkCTF{Thanks_f0r_playing_darkCTF}