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:

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è


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

thấy `SetUnhandledExceptionFilter` lạ lạ nên lên gg search thử

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

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

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

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

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

debug xuống dưới thì thấy có 2 antidebug là `int 2d` và `int 3`

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)

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

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

- [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]
```

và cuối cùng là so sánh inp sau khi biến đổi với giá trị cho trước `*byte_164118`

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

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ó


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

có được flag rồi nè:
>🚩Vậy flag là: " kcsc{unh4Ndl33xC3pTi0n_pebDebU9_nt9lob4Lfl49_s0F7w4r38r34Kp01n7_int2d_int3_YXV0aG9ydHVuYTk5ZnJvbWtjc2M===}"