(writeup) PIS CTF 2023
WEB
Super Hero
- Trang web có 1 chỗ nhận input và sau khi xem qua một lượt thì server dùng python => ssti, thử qua payload và thành công đọc flag
Payload:
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
PISCTF{s0_3zsy_SSTI_F0R_K1d}
Chôm la
- Trang web khi giải đang chạy thì mở vào là thấy joomla 3.7.0 searcrh google thì ra cve, nên chạy sqlmap là ra flag
- Ra flag dưới dạng base64 sau đấy decode ta có flag:
PISCTF{PHP_J00mla_3_7_0_!_CVE}
sql-routed
- Trang web mở ra thì thấy rõ bị lỗi sql injection, sau khi test thì thấy có thể sql blind
- Dùng script sau để đump tên db->table->column->flag:
PISCTF{qs89QdAs9A}
Blog for "LoveSicker"
- Trang web bị lỗi sql injection tại tính năng đăng ký
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
- Dùng sqlmap để dump databse name và table

- Tiếp tục dùng sqlmap để dump flag

PISCTF{SQLi_1s_3asy_R1ght?}
PIS Firmware
- Bài bị zipslip tại tính năng upload firmware
- Dùng evilarc để tạo file exploit lỗi zipslip
- Ghi đè file /templates/index.html với nội dung

PISCTF{p1s_f1rmvv@r3_7l@g}
REVERSE
SoEz
- Decompile cái file và rename các biến thì ta biết được chương trình đọc flag vào biến flag_buf và đọc 16 giá trị vào biến rand_buf lấy từ rand() với srand(time(0)):


- Sau khi đọc xong 2 biến thì chương trình thực hiện xor từng byte một. Ý tưởng ở đây là vì chương trình 32 bit nên giá trị trả về của time(0) sẽ là một số 32 bit. Do đó ta hoàn toàn có thể bruteforce giá trị này để tìm được lại các giá trị của rand_buf. Để biết được liệu rand_buf là đúng chưa thì ta xor thử 4 byte đầu của rand_buf với encrypted flag_buf nếu ra giống 4 byte đầu của định dạng file png thì là key cần tìm. Ta có script bruteforce như sau:
- Và ta brute được key là giá trị đã chuyển về chuỗi hex
f3e38606e72186d3aee2027f0e5e174f
- Do đó ta viết script python để xor lại về file flag:

PISCTF{G0oDbY3_2022_4nd_w3Lc0mE_2023}
Lucky Money
- Với bài này, ta nhập vào 1 chuỗi có độ dài 32 byte và sau đó, chương trình sẽ tách chuỗi này ra làm 2 nửa với mỗi nửa 16 byte. Nửa đầu sẽ được giữ nguyên nhưng nửa sau sẽ bị đảo lại và sẽ chèn vào các byte nửa đầu như sau:
- Sau khi đã hoán đổi vị trí xong, nó sẽ lấy chuỗi đó xor từng byte với byte 0x17:


- Sau đó nó kiểm tra nếu các byte bằng biến check thì thông báo chính xác:

- Vậy ý tưởng sẽ là lấy biến check xor từng byte với 0x17 và rồi từ cái chuỗi đã hoán vị, ta sẽ dùng hàm sau để lấy lại thứ tự ban đầu:
PISCTF{Do_Y0u_w4nT_LuCkY_M0neY?}
GoodLuck
- Bài này tác giả cho hint là "PE file" thì mình check lại offset trỏ đến IMAGE_FILE_HEADER bị thiếu signature 'PE' sau khi thêm vào thì load vào IDA bình thường

- Bài này sử dụng
RC4
để mã hóa Flag và dùng RSA
để mã hóa key

- Sau khi dùng những data từ tác giả cho để phục hồi key và flag:
d = 15773
v9 = [17103,18319,8970,8433,5203,8970,11112,5203,5203,3531]
mod = 20711
for i in v9:
print(chr(pow(i, d, mod)),end = "")
print()
from arc4 import ARC4
enc = [89,168,32,137,88,112,75,103,117,43,211,139,93,154,163,66,212,153,139,211,133,210,107,159,250,164,123,36,201,20,149,139,220]
arc4 = ARC4(b'4m_s0_p00r')
print(arc4.decrypt(bytes(enc)))
Flag: PISCTF{gjmm3_m0n3y_4nd_u_d0n3_:3}
PWN
Level1


- điều mình cần khai thác nằm ở biến something
- ngay bên dưới có hàm so sánh strncmp giữa biến something và source
- check source thử thì ta nhận được:

'>R!+Q.VEHr'
- và lệnh xor giữa something và source sẽ ra flag cho mình
- mở python và tìm byte xor giữa 'IamHaCer!!' và '>R!+Q.VEHr'

w3Lc0m37iS
- vậy thì cái script mình sẽ gửi full byte của name, rồi chèn cái dữ liệu của mình vào biến something
- viết script:

PISCTF{My_M1nd_50_3z_RI9ht_?}
Level2

- mô phỏng lại phép xor của chương trình
- tạo payload với 'IamHaCer!!' để thực thi read flag
- do flag được ghi trên stack, tận dụng bug fmt %x tại name để leak flag ra
- convert từ hex sang ascii ta có được flag
CRYPTO
Easy Crypto
- Đề bài cho:
56369025297691660392004556373781623445966955195801799383478576454199136227591253023415024495794577295554691617060609433091389
- Rất đơn giản ta chỉ việc chuyển sang dạng bytes được dạng base64 và decode chúng là ta có flag:
PISCTF{Th1s_1s_4_m3sS@g3_Fr0m_CrYpt0}
Just For Fun
- Dựa vào phần mô tả nhắc đến "vũ điệu lắc hông" và source đã cho mình đoán đến Monoalphabetic substitution cipher.
- Mình cho phần ciphertext vào tool https://www.boxentriq.com/code-breaking/cryptogram để giải thì thấy được một chữ khá giống alphabetic như dưới hình

- Mình đoán ngay là chữ đằng sau là alphabetic


PISCTF{have_fun_with_mono_alphabetic}