---
# System prepended metadata

title: antidebug_3.exe

---

antidebug_3.exe
chall: [antidebug_3.exe](https://drive.google.com/file/d/1kJdUXPCsHA9bsx8TRIuY9tx3jUv6J-Kh/view?usp=sharing)

kiểm tra và chạy thử file:
![image](https://hackmd.io/_uploads/rJeEubes6.png)
chạy thử file thấy nó bảo nhập `flag` và hiển thị ra `Status`
*(kết quả của `Status` là số ký tự flag đúng)*

Ném vào IDA:
- shift f12 thấy được chuỗi "Enter flag:" ở đây xref tới nơi gọi nó nên đặt một BP tại đây để khi chạy mình F9 cho nhanh nè

![image](https://hackmd.io/_uploads/HJsQ0-esp.png)
![image](https://hackmd.io/_uploads/Bk260ZlsT.png)

check hàm `main` ,chạy chương trình thấy nó báo lỗi chia 0


![image](https://hackmd.io/_uploads/Ske4-Geia.png)



thấy `SetUnhandledExceptionFilter` lạ lạ nên lên gg search thử 
![image](https://hackmd.io/_uploads/H1QTiblsT.png)
biết được hàm này xử lý ngoại lệ vậy để bypass  hàm này thì đặt 1 BP trước khi gặp lỗi chia 0 tại
```
idiv    [ebp+var_4]
```
thay `EIP = 0x00CA14C0` (thay EIP = địa chỉ của `TopLevelExceptionFilter`)
![image](https://hackmd.io/_uploads/ryP63Wgs6.png)
F9 thì đã vào hàm nhảy vào hàm nhập flag rồi nè
để xem được bản đồ với xem code c cần tạo function (edit -> functions -> create function)
code trông như thế này 
![image](https://hackmd.io/_uploads/rJceLzlop.png)
biết được chương trình thay đổi input vào theo từng đoạn
- inp[0 : 17]:
    inp[i] ^= 0x1
```py 
for i in range(0,17):
    inp[i] ^= 1
```

- inp[18 : 26]:
    - với 8 ký tự tiếp theo xor với `byte_714082 (= 0xaa)`
    inp[i] ^= 0xaa
```python
for i in range(18, 26):
    inp[i] ^= 0xaa  
```
![image](https://hackmd.io/_uploads/r12rzBZs6.png)

 
- inp[27 : 39]:
    - đọc asm biết được inp được thay đổi như này (với `byte_CB4083` = `0xcd`):
    
 ```pyhthon
 for i in range(12):     
    inp[i+ 27] = ((0xcd +i) & 0xff) ^ (inp[i+27]<<1 | 1) 
 ```
 ![image](https://hackmd.io/_uploads/S1cLeveja.png)

- inp[40 : 58]:
    - 9*2 giá trị tiếp theo được xor với 0x0BEEF
```python 
    for i in range(18): 
        if i % 2 == 0:
            inp[i+40] ^= 0xEF
        else:
            inp[i+40] ^= 0xBE
```

![image](https://hackmd.io/_uploads/B1rIJiei6.png)


debug xuống dưới thì thấy có 2 antidebug là `int 2d` và `int 3`
![image](https://hackmd.io/_uploads/BJA2NDxoa.png)
search thì biết được nó cũng xử lý ngoại lệ giống `SetUnhandledExceptionFilter` nhưng nó không trỏ về 1 hàm cố định như `TopLevelExceptionFilter` mà muốn bypass thì đặt breakpoint tại `int 2d` và `int 3` và thay đổi `EIP` = địa chỉ gọi giá trị của `ebp+ms_exc.old_esp` tương ứng (thay thế `EIP` tại điểm đặt BP(`int 2d `và `int 3`)  = địa chỉ của ô màu cam)
![image](https://hackmd.io/_uploads/HysXd-WiT.png)

- inp[58:64]
    - inp[i+58] = ((inp[i+58] <<(8 -i + 1)) | (inp[i+58] >> (i-1))) & 0xff

```python
#inp[58:64]
for i in range(1,5):   
    inp[i+58] = ((inp[i+58] <<(8 -i + 1)) | (inp[i+58] >> (i-1))) & 0xff

```

![image](https://hackmd.io/_uploads/BkVKtbZs6.png)


- inp[65:69]
    - 4 ký tự này được xor với `0x0C0FE1337`

```python=
#inp[65:69]
inp[65] ^= 0x37
inp[66] ^= 0x13
inp[67] ^= 0xfe
inp[68] ^= 0xc0
```

![image](https://hackmd.io/_uploads/rynx3bZsp.png)



- [71:100]
    - với 29 ký tự cuối inp[i] ^= inp[i-1]

```py   
#inp[71:100]
for i in range(71,100):
    inp[i] ^= inp[i-1]
```
![image](https://hackmd.io/_uploads/SkyIYaeo6.png)

và cuối cùng là so sánh inp sau khi biến đổi với giá trị cho trước `*byte_164118`
![image](https://hackmd.io/_uploads/ryNIp--ia.png)

==> code đề bài:

```python=
inp = input("enter flag: ")
inp = [ord(i) for i in  inp]
for i in range(100 - len(inp)):
    inp.append(0)

#inp[0:17]
for i in range(0,17):
    inp[i] ^= 1

#inp[18:26]
for i in range(18, 26):
    inp[i] ^= 0xaa  

#inp[27:39] 
for i in range(12):   
    inp[i+ 27] = ((0xcd +i) & 0xff) ^ (inp[i+27]<<1 |1) 

#[40:58]
for i in range(18): 
    if i% 2 == 0:
        inp[i+40] ^= 0xEF
    else:
        inp[i+40] ^= 0xBE

#inp[58:64]
for i in range(1,6):   
    inp[i+58] = ((inp[i+58] <<(8 -i + 1)) | (inp[i+58] >> (i-1))) & 0xff

#inp[65:69]
inp[65] ^= 0x37
inp[66] ^= 0x13
inp[67] ^= 0xfe
inp[68] ^= 0xc0

#inp[71:100]
for i in range(71,100):
    inp[i] ^= inp[i-1]

byte_164118 = [0x74 ,0x6f ,0x69 ,0x35 ,0x4f ,0x65 ,0x6d ,0x32 ,0x32 ,0x79 ,0x42 ,0x32 ,0x71 ,0x55 ,0x68 ,0x31 ,0x6f ,0x5f ,0xdb ,0xce ,0xc9 ,0xef ,0xce ,0xc9 ,0xfe ,0x92 ,0x5f ,0x10 ,0x27 ,0xbc ,0x9 ,0xe ,0x17 ,0xba ,0x4d ,0x18 ,0xf ,0xbe ,0xab ,0x5f ,0x9c ,0x8e ,0xa9 ,0x89 ,0x98 ,0x8a ,0x9d ,0x8d ,0xd7 ,0xcc ,0xdc ,0x8a ,0xa4 ,0xce ,0xdf ,0x8f ,0x81 ,0x89 ,0x5f ,0x69 ,0x37 ,0x1d ,0x46 ,0x46 ,0x5f ,0x5e ,0x7d ,0x8a ,0xf3 ,0x5f ,0x59 ,0x1 ,0x57 ,0x67 ,0x6 ,0x41 ,0x78 ,0x1 ,0x65 ,0x2d ,0x7b ,0xe ,0x57 ,0x3 ,0x68 ,0x5d ,0x7 ,0x69 ,0x23 ,0x55 ,0x37 ,0x60 ,0x14 ,0x7e ,0x1d ,0x2f ,0x62 ,0x5f ,0x62 ,0x5f]
print(inp == byte_164118)
```

==> script của bài là:
```py=
key = [0x74, 0x6f, 0x69, 0x35, 0x4f, 0x65, 0x6d, 0x32, 0x32, 0x79, 0x42, 0x32, 0x71, 0x55, 0x68, 0x31, 0x6f, 0x5f, 0xdb, 0xce, 0xc9, 0xef, 0xce, 0xc9, 0xfe, 0x92, 0x5f, 0x10, 0x27, 0xbc, 0x9, 0xe, 0x17, 0xba, 0x4d, 0x18, 0xf, 0xbe, 0xab, 0x5f, 0x9c, 0x8e, 0xa9, 0x89, 0x98, 0x8a, 0x9d, 0x8d, 0xd7, 0xcc, 0xdc, 0x8a, 0xa4, 0xce, 0xdf, 0x8f, 0x81, 0x89, 0x5f, 0x69, 0x37, 0x1d, 0x46, 0x46, 0x5f, 0x5e, 0x7d, 0x8a, 0xf3, 0x5f, 0x59, 0x1, 0x57, 0x67, 0x6, 0x41, 0x78, 0x1, 0x65, 0x2d, 0x7b, 0xe, 0x57, 0x3, 0x68, 0x5d, 0x7, 0x69, 0x23, 0x55, 0x37, 0x60, 0x14, 0x7e, 0x1d, 0x2f, 0x62, 0x5f, 0x62, 0x5f]

for i in range(17):
	key[i] ^= 0x1

for i in range(18,26):
	key[i] ^= 0xaa

for i in range(12):
	key[i+27] = (((0xcd +i) & 0xff) ^ key[i+27]) >>1

for i in range(18): 
    if i% 2 == 0:
        key[i+40] ^= 0xEF
    else:
        key[i+40] ^= 0xBE

for i in range(1,5):
    key[59+i] = ((key[59+i]<< i) | (key[59+i]>> (8-i)) )& 0xff

key[65] ^= 0x37
key[66] ^= 0x13
key[67] ^= 0xfe
key[68] ^= 0xc0

for i in range(99,70,-1):
    key[i] ^= key[i-1]
print("".join(chr(i) for i in key))

#unh4Ndl33xC3pTi0n_qdcEdcT8_nt9lob4Lfl49_s0F7w4r38r34Kp01n7_int2d_int3_YXV0aG9ydHVuYTk5ZnJvbWtjc2M===
```

chạy bài:
![image](https://hackmd.io/_uploads/BktwlBWo6.png)
biết được có 8 ký tự bị sai, 8 ký tự thì chỉ chắc phần inp[18:26] có antidebug rồi vì thế chạy ngược lại code

xref `byte_714082` và nhảy tới chỗ khởi tạo giá trị cho nó
![image](https://hackmd.io/_uploads/HywrQSZoa.png)


![image](https://hackmd.io/_uploads/HyGkXrZja.png)
biết được `byte_714082 = 0xab ^ byte ptr [edx+2]`  nhìn lên trên thấy có lệnh `mov     eax, large fs:30h` được dùng để trỏ tới TEB có thể có antidebug khi gọi tới ở đây mà antidebug thì trả về giá trị 0 với 1 thôi nên lúc debug qua `eax, byte ptr [edx+2]` thay đổi giá trị của eax từ 1 thành 0  -> `byte_714082` lúc này = `0xab`
-> sửa lại code của scrip bài ở dòng 7 thành `key[i] ^= 0xab`
có được key nhập vào là: `unh4Ndl33xC3pTi0n_pebDebU9_nt9lob4Lfl49_s0F7w4r38r34Kp01n7_int2d_int3_YXV0aG9ydHVuYTk5ZnJvbWtjc2M===`

chạy lại file ạ:
![image](https://hackmd.io/_uploads/By4S2hZjp.png)
có được flag rồi nè:
>🚩Vậy flag là: " kcsc{unh4Ndl33xC3pTi0n_pebDebU9_nt9lob4Lfl49_s0F7w4r38r34Kp01n7_int2d_int3_YXV0aG9ydHVuYTk5ZnJvbWtjc2M===}"