# [Write-Up RE] RE ASCIS Warmup 2023 ## Oxygen ![](https://hackmd.io/_uploads/rkUFhPeba.png) ## Thực hành Chạy thử chương trình, hiện string nhưng không nhập được ký tự, ngho có sleep trong chương trình ![](https://hackmd.io/_uploads/Bkb02vgbT.png) Load vào IDA tìm kiếm theo string **gimme oxygen!** ta đến được hàm sau: ![](https://hackmd.io/_uploads/Sk5mpwgWp.png) Đặt Breakpoint sau hàm puts và bật debug thì nhận thấy chương trình chưa đi được đến đó mà bị ngắt quãng tại đây: ![](https://hackmd.io/_uploads/HkHOpDlWT.png) ![](https://hackmd.io/_uploads/rya_TPxZ6.png) Tiếp tục nhấn F8 ta đến được một hàm throw exception ![](https://hackmd.io/_uploads/rJws6PlZT.png) Tìm tham chiếu của hàm này ta đến được đây, hàm này bị ngắt giống hàm throw excep ta tiến hành đổi tên hàm throw excep thành **catch** ![](https://hackmd.io/_uploads/BkamADgb6.png) Ta thấy do hàm **catch** bị ngắt dẫn đến hàm này bị ngắt quãng. Ta đặt breakpoint trước **catch** và tiến hành debug lại đến offset **00007FF7BE5DB927**: ![](https://hackmd.io/_uploads/S175RDlZT.png) Nhấn F8 sau đó set IP sang offset **00007FF7BE5DB931** ta có thể tiếp tục thực thi hàm. Đoạn sau ta thấy nó tạo **socket** tại **localhost** ở port 1337 sau đó lắng nghe trên port này. Ta gửi vào 1 ký tự bằng telnet thì thấy nó chạy đến một hàm shellcode ![](https://hackmd.io/_uploads/BkNdkueZT.png) ![](https://hackmd.io/_uploads/rkDFkOxb6.png) Nhìn ngược lên trên tìm nguồn shellcode và make nó thì ta nhận được một đống bùi nhùi: ![](https://hackmd.io/_uploads/S1-Pl_lZ6.png) Chứng tỏ shellcode này không đúng. Sau một hồi tìm thì mình nhớ đến hàm **catch** tại đây nó cũng bị ngắt nên đọc lại phần ngắt còn lại thì ơ rê ca: ![](https://hackmd.io/_uploads/B1Toxulb6.png) Nó xor 0x7B byté của shelcode với 0x69. Ta viết một đoạn python để decode đống này: ``` #from idapython import ida_bytes start = 0x00007FF78446D000 end = 0x00007FF78446D07B for i in range(start, end+1): tmp = ida_bytes.get_byte(i) tmp ^= 0x69 ida_bytes.patch_byte(i, tmp) ``` Sau đó ta nhận được đoạn shellcode đẹp sau: ![](https://hackmd.io/_uploads/HJUBZdx-6.png) Make func và lấy mã giả ![](https://hackmd.io/_uploads/BJALZux-p.png) Sửa lại tham số chút :)) ![](https://hackmd.io/_uploads/HkNqZulW6.png) Viết hàm giải mã input và send socket ``` import socket def send_flag_to_localhost(flag): try: client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('localhost', 1337)) client_socket.send(flag) response = client_socket.recv(1024) # 1024 là độ dài tối đa của dữ liệu nhận về print("Server response:", response.decode('utf-8')) client_socket.close() except Exception as e: print("Error:", str(e)) cipher = [0x6E, 0x5B, 0x7D, 0x3E, 0x7D, 0x43, 0x5D, 0x71, 0x52, 0x6D, 0x5B] gen = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+-=[]{}|;:'\",.<>?/" flag = [] for i in range(11): for x in gen: if (i % 2 == 0 and (ord(x) | 0xA) - (ord(x) & 0xA) == cipher[i]): flag.append(ord(x)) break if (i % 2 == 1 and (ord(x) | 0xA) + (ord(x) & 0xA) == cipher[i]): flag.append(ord(x)) break print(bytes(flag)) send_flag_to_localhost(bytes(flag)) ``` ![](https://hackmd.io/_uploads/rycxfOg-a.png) #### Flag: ASCIS{W3_g0nn4_m33t_4t_th3_f1naL_r0uND} 🤑🤑🤑 --Ckagngoc--