Imaginary CTF 2021

Note : A JOURNEY TO GAIN KNOWLEDGE

Giải này mình học thêm một xíu về mảng MiscForensics

#Misc

Spelling Test

file: chall

Tóm tắt: bài này cho mình một file txt có 2175 từ vựng, trong đó một số từ viết sai 1 chữ cái, mình cần tìm ra các chữ cái sai và ghép chúng lại. Đọc đến đây mình nhớ đến câu nói của vị hiền nhân nào đó "Cần lao vi tiên thủ...." . Tìm từng chữ thì chầy cối quá mình dùng thêm proodfread để hỗ trợ : D

flag: ictf{youpassedthespellingtest}

Formatting

file: Chall

một bài code theo oop, bài này lỗi ở str format vulnerability . String formatting functions có thể truy cập đến thuộc tính của đối tượng cũng như làm rò rỉ dữ liệu.

Tham khảo thêm.

Mình sẽ gửi dạng {people_obj.__init__.__globals__[CONFIG][KEY]} cho server

Mình không thể làm được bài này nếu thiếu sự giúp đỡ của ông hoàng Hướng Đối Tượng FuckAdapt, aligatooooooo (⸝⸝ᵕᴗᵕ⸝⸝).

#Forensics

Vacation

Chall là tìm địa điểm của hình trên dưới dạng latitude_longitude(vĩ độ, kinh độ)

flag: ictf{38.947_-119.961}

#Crypto

Rock Solid Algorithm

n = 18718668654839418101060350414897678724581774081742102287908765212690862231899547405582997157020093499506177632395430572542600019258424947803591395926472246347413986531437177801754324606200243710836609694453888894668656807471052095014376204102474311740080044776201105722801365112971807912406879483156845216746137339614577267869908065296042390812575960639865867729920434603853708907147465162697098688239587320232595412227310236678367
e = 5
c = 4061448515799106340420739691775850071489215699577921072934942485890519294380069123037340174441242842518682390853378784679825023237216051766738593812159344136064529711265570171627670665806072255545198689928996413238102114126558579154343844959868438278433954975590137693439216155482228025380904377837299357044104373966173149290333194304831238889245126840666444234215617022142380016275718234640045049962318290976661640301222078289152

Dạng RSA với e nhỏ nên ta dễ dàng brute force với flag = 5 √ (k*n + c) với k ∈ Z

from Crypto.Util.number import*

n = 18718668654839418101060350414897678724581774081742102287908765212690862231899547405582997157020093499506177632395430572542600019258424947803591395926472246347413986531437177801754324606200243710836609694453888894668656807471052095014376204102474311740080044776201105722801365112971807912406879483156845216746137339614577267869908065296042390812575960639865867729920434603853708907147465162697098688239587320232595412227310236678367
e = 5
c = 4061448515799106340420739691775850071489215699577921072934942485890519294380069123037340174441242842518682390853378784679825023237216051766738593812159344136064529711265570171627670665806072255545198689928996413238102114126558579154343844959868438278433954975590137693439216155482228025380904377837299357044104373966173149290333194304831238889245126840666444234215617022142380016275718234640045049962318290976661640301222078289152

i = 1
def find_invpow(x,n):
    high = 1
    while high ** n < x:
        high *= 2
    low = high//2
    while low < high:
        mid = (low + high) // 2
        if low < mid and mid**n < x:
            low = mid
        elif high > mid and mid**n > x:
            high = mid
        else:
            return mid
    return mid + 1
while True:
    flag = long_to_bytes(find_invpow(i*n+c,5))
    if b'ictf' in flag:
        print(flag,i)
    i+=1
#b'ictf{3_isnt_th3_0nly_sm4ll_3xp0n3nt}'

flag: ictf{3_isnt_th3_0nly_sm4ll_3xp0n3nt}

Flip Flops

file: Chall

về ý tưởng : đầu tiên ta phải gửi chuỗi hex cho server, server encode mọi chuỗi trừ trường hợp có cụm 'gimmeflag', bước 2 check lại nếu trong chuỗi vừa encode có cụm 'gimmeflag' server sẽ trả lại flag. Đây là mã CBC, block đầu tiên sẽ được xor với block iv, các block sau sẽ được xor với block trước nó. Ở đây ta không kiểm soát được block đầu tiên nên bỏ qua, ta gửi cụm aaaaaaaaaaaaaaaaGimmeflag , sau khi encode xong ta đổi kí tự đầu tiên là G thành g .

Ta đổi kí tự đầu tiên cho dễ, rõ hơn:

32 = ord('G') xor ord('g') ( G xor g)

ta lấy kí tự đầu tiên của chuỗi sau khi encode ở dạng hex là :

0xb7^32 ( G xor( G xor g )) = g ) ta lại thu được g chuyển lại hex và thay là xong Gimmeflag -> gimmeflag

flag: ictf{fl1p_fl0p_b1ts_fl1pped_b6731f96}

Lines

file: Chall

bài này ta có :

flag_enc = (s * flag)%p

msg_enc= (s * msg)%p

ta dễ dàng tìm được s bằng nghịch đảo: s = (msg^-1 * msg_enc )%p tương tự ta tìm được flag .

from Crypto.Util.number import *
import random

msg = bytes_to_long(b":roocursion:")
p = 82820875767540480278499859101602250644399117699549694231796720388646919033627
flag_enc = 26128737736971786465707543446495988011066430691718096828312365072463804029545
msg_enc = 15673067813634207159976639166112349879086089811595176161282638541391245739514

# s  = g^(ab) mod p
# flag_enc = (s * flag)%p
# msg_enc=(s * msg)%p

s = (pow(msg,-1,p) * msg_enc)%p 
print(s)
print(long_to_bytes((inverse(s,p) * flag_enc )%p))

flag: ictf{m0d_4r1th_ftw_1c963241}

#Misc

Puzzle 2

người solve: FuckAdapt

file : chall

Bài này rất thú vị, chall là một game như minecraft mình có thể di chuyển mọi nơi trong này nhưng có duy nhất một cánh cửa không mở được, đương nhiên flag nằm trong đây rồi. Về ý tưởng mình phải tìm cách "mở" cửa hoặc đi xuyên qua nó :)

ta có source game rồi, sử dụng dnspy thêm 1 dòng code này để tắt collision và cheat đi xuyên tường :)). Tham khảo thêm.

flag: ictf{SPY_KIDS_ASSEMBLE}

Bài Puzzle2 này do bạn của mình lớp cntt solve, trong một lần đi khịa dạo mình thách thằng bạn làm được bài này, ai ngờ bạn solve được thật :> . Do cậu í không chơi ctf nên mình để tạm ý tưởng cậu ở đây nhó babe <3 .

Thanks for reading. Have a good day ٩(๑> ₃ <)۶♥

Last updated