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===}"