2024 Apr THJCC CTF

卡補習Day整個爛掉

Mon Apr 29 2024
1178 words · 10 minutes

前言

image

Web

Empty

進入到網頁後,看到有個怪怪標頭,感覺可以直接前往 image 找到其中一段 image 看一下cookie有什麼東東 image

FLAG:THJCC{cookie_&_view_source_!} THJCC CTF


Blog

這題靠通靈 image 密碼是這個 image username=admin password=iloveshark

FLAG:THJCC{w31c0me_h@cker} THJCC CTF


Reverse

Baby C

會發現這題只是XOR而已,反著回去就好,反正數值都給你了 截原題目程式

int main(){
char c[50];
int a[50]={44, 48, 50, 59, 59, 3, 16, 12, 12, 8, 11, 66, 87, 87, 15, 15, 15, 86, 1, 23, 13, 12, 13, 26, 29, 86, 27, 23, 21, 87, 15, 25, 12, 27, 16, 71, 14, 69, 75, 32, 59, 46, 53, 75, 63, 75, 8, 22, 11, 5};
scanf("%s", c);
for(int i=0;i<50;i++){
if (((int)c[i]^120)!=a[i]){
printf("Password Incorrect!!!\n");
return 0;
}
}
printf("Password Correct!!!\n");
return 0;
}

解題程式

int main() {
int a[50] = {44, 48, 50, 59, 59, 3, 16, 12, 12, 8, 11, 66, 87, 87, 15, 15, 15, 86, 1, 23, 13, 12, 13, 26, 29, 86, 27, 23, 21, 87, 15, 25, 12, 27, 16, 71, 14, 69, 75, 32, 59, 46, 53, 75, 63, 75, 8, 22, 11, 5};
char c[51];
for(int i = 0; i < 50; i++) {
c[i] = (char)(a[i] ^ 120);
}
printf("%s\n", c);
return 0;
}

FLAG:THJCC{https://www.youtube.com/watch?v=3XCVM3G3pns} THJCC CTF


PYC REVERSE

這題要把.pyc還原 用線上反編譯工具就好 反編譯的結果

#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 3.10
from FLAG import FLAG
from Crypto.Util.number import bytes_to_long
def xor1(flag):
return flag ^ 124789
def xor2(flag):
return flag ^ 487531
def xor3(flag):
return flag ^ 784523
def xor4(flag):
return flag ^ 642871
def xor5(flag):
return flag ^ 474745
flag = bytes_to_long(FLAG)
count = 0
count += 1
if count == 1:
flag = xor1(flag)
count += 2
if count == 3:
flag = xor2(flag)
count += 1
if count == 4:
flag = xor3(flag)
count -= 2
else:
flag = xor2(flag)
count += 1
else:
flag = xor3(flag)
count += 5
if count == 2:
flag = xor4(flag)
elif count == 6:
flag = xor5(flag)
print(flag)

發現跟著msg.txt逆著XOR回去就好 解題程式:

from Crypto.Util.number import long_to_bytes
flag = FLAG = 10730390416708814647386325276467849806006354580175878786363505755256613965929606057246313695
def xor1(flag):
return flag ^ 124789
def xor2(flag):
return flag ^ 487531
def xor3(flag):
return flag ^ 784523
def xor4(flag):
return flag ^ 642871
def xor5(flag):
return flag ^ 474745
count = 0
count += 1
if count == 1:
flag = xor1(flag)
count += 2
if count == 3:
flag = xor2(flag)
count += 1
if count == 4:
flag = xor3(flag)
count -= 2
else:
flag = xor2(flag)
count += 1
else:
flag = xor3(flag)
count += 5
if count == 2:
flag = xor4(flag)
elif count == 6:
flag = xor5(flag)
print(long_to_bytes(flag))

FLAG:THJCC{pyc_rev3r3e_C3n_u32_on1i5e_t0Ol} THJCC CTF


Pwn

nc

連上nc後他會問你Never Gonna Give You Up的作者是誰

FLAG:THJCC{N3veR_g0nn4_l37_You_dOwn!!!} THJCC CTF

NPSC

我用垃圾寫法寫得 運算之久讓我感到疑惑

from pwn import *
def max_score(balls):
if not balls:
return 0
max_score = 0
for i in range(len(balls)):
score = balls[i]
remaining_balls = balls[i+1:]
for j in range(len(remaining_balls)):
if score >= remaining_balls[j]:
score += remaining_balls[j]
else:
break
max_score = max(max_score, score)
return max_score
io = remote('23.146.248.36', 30003)
io.recvlines(4)
for round_ in range(3):
print(f'=============== ROUND {round_+1} ===============')
if round_ in [1, 2]:
for _ in range(10):
numbers = eval(io.recvline().decode().strip())
io.sendline(str(max_score(numbers)).encode())
result = io.recvline().decode().strip()
print(f'Input: {numbers}')
print(f'Output: {result}')
io.interactive()

Crypto

博元婦產科

其實也就解密這個TUFDVlZ7cFBwLnU0VXJmVGQzay52MEYubVB9Cg== 先憑直覺,Base64回去 image 確實格式有對,然後試試看是不是凱薩 一個一個try會發現是位移19個 image

FLAG:THJCC{wWw.b4BymAk3r.c0M.tW} THJCC CTF


Baby RSA

只要用線上的rsa decoder就好了 image

FLAG:THJCC{small_eeeee_can_be_pwned_easily} THJCC CTF


《SSS.GRIDMAN》

在題目中看到會生成二次方程式的樣子

def random_ploy():
poly=[]
for i in range(2):
poly.append(random.randint(99,999))
return poly

polyc 被定義為這兩個係數加上secret用成常數項:

polyc =random_ploy()
polyc.append(secret)
poly_enc = numpy.poly1d(polyc)

numpy.poly1d(polyc) 會 return ax^2 + bx + c 的二次方程式,其中 ab 是隨機的,csecret f(x_value, y_value, x) 給定一系列的資料點(x_value, y_value),函數計算了多項式在 x 點的值。 其中,shares是題目給我的資料點,就可以找到了。 總體而現 就是藉由三個點找到方程式的常數項而已。 參考文獻:拉格朗日插值多項式 解決程式:

def f(x_value, y_value, x):
result = 0
for i in range(len(x_value)):
temp = y_value[i]
for j in range(len(x_value)):
if j != i:
temp = temp * (x - x_value[j]) / (x_value[i] - x_value[j])
result += temp
return result
shares = [(139, 3875728327), (982, 4473718807), (707, 4179926407)] #把點點丟進來
x_value, y_value = zip(*shares)
secret = f(x_value, y_value, 0)
print("密碼是:", int(secret))

image

FLAG:THJCC{SSS_1s_a_c001_w2y_t0_pr0t3c7_s3c23t} THJCC CTF


Misc

原神帳號外流

會有一個登入介面,要從網路封包去抓取 image 打開封包來看,每一組都試一遍,FLAG就噴出來了 image

FLAG:THJCC{W3r3_sHarKKKKKK_MasT3R_C8763} THJCC CTF


PyJail-0

這是題目執行程式

WELCOME='''
____ _ _ _
| _ \ _ _ | | __ _(_) |
| |_) | | | |_ | |/ _` | | |
| __/| |_| | |_| | (_| | | |
|_| \__, |\___/ \__,_|_|_|
|___/
'''
def main():
print("-"*30)
print(WELCOME)
print("-"*30)
print("Try to escape!!This is a jail")
a=input("> ")
eval(a)
if __name__ == '__main__':
main()

會發現只要能跳過就可以 所以只要輸入eval(input()) 然後拿到存取的方式__import__('os').system('sh') image 這樣就拿到了

FLAG:THJCC{Use_M2g1c_f2un3ti0n_in_P9Ja1l!!} THJCC CTF


PyJail-1

WELCOME='''
____ _ _ _
| _ \ _ _ | | __ _(_) |
| |_) | | | |_ | |/ _` | | |
| __/| |_| | |_| | (_| | | |
|_| \__, |\___/ \__,_|_|_|
|___/
'''
def main():
try:
print("-"*30)
print(WELCOME)
print("-"*30)
print("Try to escape!!This is a jail")
print("I increased security!!!")
a=input("> ")
if len(a)<15:
eval(a)
else:
print("Don't escape!!")
except:
print("error")
exit()
if __name__ == '__main__':
main()

感覺相較上一題變複雜了,但是用同一個策略還是行的通 image

FLAG:THJCC{Inp3t_b9p2sss_lim1t_1n+p3j2i1!} THJCC CTF


Thanks for reading!

2024 Apr THJCC CTF

Mon Apr 29 2024
1178 words · 10 minutes