# [Write-Up RE] RE ASCIS Warmup 2023
## Oxygen

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

Load vào IDA tìm kiếm theo string **gimme oxygen!** ta đến được hàm sau:

Đặ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:


Tiếp tục nhấn F8 ta đến được một hàm throw exception

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**

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**:

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


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:

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:

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:

Make func và lấy mã giả

Sửa lại tham số chút :))

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))
```

#### Flag: ASCIS{W3_g0nn4_m33t_4t_th3_f1naL_r0uND}
🤑🤑🤑
--Ckagngoc--