---
# System prepended metadata

title: '[Write-Up RE] RE ASCIS Warmup 2023'
tags: [Write-Up CTF Events]

---

# [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--