(writeup) WaniCTF 2023
netcat (Beginner)
- đơn giản là netcat rồi tính máy tính thôi
- khỏi script =)))))

FLAG{1375_k339_17_u9_4nd_m0v3_0n_2_7h3_n3x7!}
only once (Beginner)
- bài này cũng thế, nhưng coi source ms hiểu được
- source code:
- này tựa tựa lỗi IOF nhưng k phải, lỗi là nếu ta nhập hơn 8 byte ngay đây sẽ ra shell

FLAG{y0u_4r3_600d_47_c41cu14710n5!}
ret2win (Easy)
- run file thử và dựa vào đề in ra biết được offset cũng như hướng đi
- ret2win đơn giản và nhẹ nhàng

FLAG{f1r57_5739_45_4_9wn3r}
shellcode_basic (normal)
- tên đề cũng như chall cho sẵn script
- việc mình là chèn shellcode là xong

FLAG{NXbit_Blocks_shellcode_next_step_is_ROP}
Beginner ROP (normal)

- bài này là ROPchain
- thì sẽ liên quan tới rdi,rsi,rdx và rax
- thì có lẽ mình tìm pop từng cái k được (không đủ)

- thì trong source code có tạo ra từng hàm cho mình mà các hàm đều liên quan đến 3 thằng mình sẽ cần (rdi,rsi,rdx)

- thì idea trước mắt sẽ là ret từng cài luôn
- riêng thằng rdi thì nó sẽ đưa vị trí $rsp vào $rdi khi return (tức là ngay $rbp ở lần nhập của mình)
- vậy thì mình sẽ để '/bin/sh\0' ngay trước $rip
- và cần padding đủ 96 byte để kết thúc vòng lặp while và return

- trong hình là '/bin/sh\0' đã vào $rdi
- nhưng ở ret thứ 2 thì xor của rsi lại trỏ đến địa chỉ (bad)
- lúc này đổi hướng suy nghĩ:
- nếu trên source code có hàm xor_rsi các kiểu thì gadget của cái đó chắc sẽ có

- vậy mình sẽ lấy gadget xor cúi cùng ở 2 thanh ghi rsi và rdx

FLAG{h0p_p0p_r0p_po909090p93r!!!}
Canaleak (normal)

- hướng đi của đề là mình cần ret2win nhưng đồng thời k động chạm tới canary
- thì mình sẽ leak canary, rồi chèn payload sao cho tới vị trí canary thì mình ghi lại canary r ghi đè tới rip trỏ tới hàm mình cần
- chương trình sẽ vào vòng lặp while(), miễn payload mình nó khác với chứ 'YES' thì tiếp tục cho mình nhập lần sau
- thì trong source có hàm printf() in lại những gì mình nhập –-> nghĩ ngay đến fmtstr

vị trí thứ 9 là %9$p
- và để kết thúc vòng lặp thì mình cần có chữ 'YES' trong payload và ghi đè canary rồi ret về
win

FLAG{N0PE!}
ret2libc (normal)

- tìm pop_rdi k có nên hướng đi leak libc như bth không được


- nên đổi qua chơi 'dirty' xíu là lấy những gì đề in ra

vị trí đó là __libc_start_call_main
nên tính offset thôi
- việc còn lại là /bin/sh với system như bth
pop_rdi có thể lấy của libc vì exe k có sẵn
thêm ret cho stack chẵn

- script: (của pwninit lấy đỡ cho nhanh XDD)
FLAG{c0n6r475_0n_6r4du471n6_45_4_9wn_b361nn3r!}
Time Table (hard)


- chạy hàm register_student(v4) đầu tiên

- ở lần nhầp đàu tiên cho user(name), id và major
- dù k có BOF nhưng khá là ghi ngờ biến buf
- source code bug position:


- idea: k có chỗ tạo shell hay ret2win nên sẽ làm ret2libc hoặc one_gadget
- đầu tiên sẽ leak libc
- hướng đi:
-
-
- case 2 (elective) ghi đè tại vị trí của môn học ở (mandatory)
-
- case 4 (write_memo) sẽ ghi stderr để leak
-
- case 2 (elective) để lấy byte leak (
tên môn - tên giáo
sư bây giờ sẽ đổi thành tên môn - byte leak
)
- vì chall k cho libc nên tìm trên libc.blukat.me và lấy xuống
- đồng thời pwninit luôn
-
- tiếp tục sau khi leak libc là tới lần chờ nhập môn ở case 2
-
- lúc này ta sẽ chọn môn khác tránh trùng nơi tkb mình dg leak
-
- rồi case4 lần nữa để ghi thành địa chỉ r_w và tới one_gadget
- nhưng thử hết các gadget thì đều k cho ta shell
- DEBUG chậm lại lúc
call rax

- lúc này nó call vào địa chỉ của 1 user hơi lạ lạ
- user là lúc từ khi mình bắt đầu nhập vào

- thế thì thay vì nhập nùi byte 'a', ta sẽ nhập '/bin/sh\0' và system luôn, không cần one_gadget


FLAG{Do_n0t_confus3_mandatory_and_el3ctive}
(writeup) WaniCTF 2024
nc
FLAG{th3_b3ginning_0f_th3_r0ad_to_th3_pwn_p1ay3r}
do-not-rewrite
FLAG{B3_c4r3fu1_wh3n_using_th3_f0rm4t_sp3cifi3r_1f_in_sc4nf}
do-not-rewrite2
FLAG{r0p_br0d3n_0ur_w0r1d}