
I_HATE_DEBUGGING
- Đầu tiên tôi mở IDA để check code của bài này.

- Hàm main này khá là clean, theo mạch chính ta biết sẽ có một đoạn check xem ta có đang debug không, nếu có thì sẽ dừng chương trình luôn nhưng ở đây ta có thể bỏ qua được đoạn này nên cũng không cần để ý đến nó lắm.
- Điều ta cần chú ý chính là hàm
decodeflag. - Ta cùng phân tích xem nó đang làm gì.

- Phân tích qua thì ta sẽ biết được hàm này lấy 7 ký tự đầu trong fakeflag để gán vào mảng
filetxt, 7 ký tự này tương ứngfwectf{.
{ v = memory[i_0 - 6]; v = (v >> 3) | (32 * v); v ^= 0x5Au; filetxt[i_0] = v;}- Tiếp đến là lấy các giá trị trong mảng
memoryra, đi qua 1 lần shift xong xor với 0x5A và gán vào mảngfiletxt. - Hàm này khá tường mình, không có gì rắc rối cả.
- Ta cùng tiến hành debug để xem kết quả cuối cùng của nó sẽ là gì.

- Ở đoạn này ta có thể đổi RIP để nhảy trực tiếp qua phần check debug và hook.
- Giờ thì ta chỉ cần đi vào hàm
decodeflagvà chạy đến cuối để xem flag là gì.

- Chạy đến cuối thì ta đã có được flag, cùng in ra xem nó là gì.
filetxt = bytearray([ 0x66, 0x77, 0x65, 0x63, 0x74, 0x66, 0x7B, 0x03, 0x6D, 0x6C, 0x2A, 0x6F, 0x03, 0x18, 0x44, 0x65, 0x86, 0x6A, 0x78, 0x6C, 0x7F, 0x6A, 0x70, 0x64, 0x7F, 0x67, 0x70, 0x4C, 0x70, 0x78, 0x7F, 0x67, 0x44, 0x75, 0x46, 0x3E, 0x30, 0x21, 0x6D, 0x5F, 0x48, 0x30, 0x37, 0x56, 0x49, 0x30, 0x21, 0x6A, 0x7D])
print(filetxt)
# bytearray(b'fwectf{\x03ml*o\x03\x18De\x86jxl\x7fjpd\x7fgpLpx\x7fgDuF>0!m_H07VI0!j}')- Nhìn qua thì ta thấy ta mới chỉ tìm được 1 vài ký tự trong flag thôi, tại sao lại thế.

- Sau đó tôi đã kiểm tra lại xem liệu mảng
filetxtcó đang được sử dụng ở đâu không thì thấy có một hàm khác cũng gọi đếnfiletxt. - Cùng xem nó đang làm gì.

- Như trên ảnh, tuy ở mã Pseudocode rất ít nhưng mà bên asm thì lại rất nhiều nhánh code.
- Chương trình chắc chắn đang chặn không cho IDA thấy được phần quan trọng của hàm này.
- Ta cùng phân tích xem hàm này đang làm gì mà IDA lại không thể dịch được.

- Đầu tiên nó chạy một hàm check debug, nếu đang debug thì sẽ sleep 1s và return luôn.

- Còn nếu không debug thì sẽ nhảy luôn vào phần như trên ảnh.

- Nhìn lại thì ta thấy được ở phần này, ta có thể thấy khi cmp 1 với 1 thì sẽ luôn nhảy sang phần
originaldebug(), đây chỉnh là lý do tại sao IDA không thể dịch được toàn bộ sang Pseudocode. - Giờ tôi tiến hành đổi hex code của
jnzthànhjzđể chương trình sẽ luôn nhảy vào phần còn lại của hàm.

- Ở đây tôi đã sửa lại thành
jzvà đã thấy được thấy được phần còn lại của hàm này
for ( i = 0; i <= 49; ++i ) memory[i] = filetxt[i];for ( i_0 = 35; i_0 <= 47; ++i_0 ){ if ( i_0 % 3 ) LOBYTE(v8) = (LOBYTE(filetxt[i_0]) ^ 0xD) + 4; else v8 = filetxt[i_0]; memory[i_0] = v8;}for ( i_1 = 7; i_1 <= 13; ++i_1 ) memory[i_1] = LOBYTE(filetxt[i_1]) ^ 0x5C;for ( i_2 = 14; i_2 <= 34; ++i_2 ){ if ( (i_2 & 1) != 0 ) memory[i_2] = filetxt[i_2] - 3; else memory[i_2] = filetxt[i_2] - 17;}for ( i_3 = 49; i_3 > 6; --i_3 ) memory[i_3 + 1] = memory[i_3];memory[7] = 73;return originaldebug();- Phân tích qua thì tôi thấy hàm này cũng không quá khó để dịch ngược, hoàn toàn có thể chuyển ngay sang code python.
- Giờ thì tôi sẽ hoàn thành nốt phần còn lại của mã hóa flag trong script python.
- Dưới đây sẽ là script python của tôi.
filetxt = bytearray([ 0x66, 0x77, 0x65, 0x63, 0x74, 0x66, 0x7B, 0x03, 0x6D, 0x6C, 0x2A, 0x6F, 0x03, 0x18, 0x44, 0x65, 0x86, 0x6A, 0x78, 0x6C, 0x7F, 0x6A, 0x70, 0x64, 0x7F, 0x67, 0x70, 0x4C, 0x70, 0x78, 0x7F, 0x67, 0x44, 0x75, 0x46, 0x3E, 0x30, 0x21, 0x6D, 0x5F, 0x48, 0x30, 0x37, 0x56, 0x49, 0x30, 0x21, 0x6A, 0x7D])
memory = bytearray(100)for i in range(49): memory[i] = filetxt[i]for i in range(35, 48): if ( i % 3 ): v8 = (filetxt[i] ^ 0xD) + 4 else: v8 = filetxt[i] memory[i] = v8for i in range(7, 14): memory[i] = (filetxt[i] ^ 0x5C)for i in range(14, 35): if ( (i & 1) != 0 ): memory[i] = filetxt[i] - 3 else: memory[i] = filetxt[i] - 17for i in range(48, 6, -1): memory[i + 1] = memory[i]memory[7] = 73
print(memory.decode())- Đây là đoạn script python sau khi thêm phần xử lý của hàm
newopen(). - Sau khi chạy thì tôi đã có được flag chính thức của bài này.
Flag
fwectf{I_10v3_D3bugging_and_I_und3r5700d_IA7_H00k}A
class _A(type): def __xor__(AA, AAA): return AA(AAA) def __invert__(AA): return globals() def __mod__(AA, AAA): return __import__("base64").b64decode(['QXJpdGhtZXRpY0Vycm9y', 'QXNzZXJ0aW9uRXJyb3I=', 'QXR0cmlidXRlRXJyb3I=', 'QmFzZUV4Y2VwdGlvbg==', 'QmFzZUV4Y2VwdGlvbkdyb3Vw', 'QmxvY2tpbmdJT0Vycm9y', 'QnJva2VuUGlwZUVycm9y', 'QnVmZmVyRXJyb3I=', 'Qnl0ZXNXYXJuaW5n', 'Q2hpbGRQcm9jZXNzRXJyb3I=', 'Q29ubmVjdGlvbkFib3J0ZWRFcnJvcg==', 'Q29ubmVjdGlvbkVycm9y', 'Q29ubmVjdGlvblJlZnVzZWRFcnJvcg==', 'Q29ubmVjdGlvblJlc2V0RXJyb3I=', 'RGVwcmVjYXRpb25XYXJuaW5n', 'RU9GRXJyb3I=', 'RWxsaXBzaXM=', 'RW5jb2RpbmdXYXJuaW5n', 'RW52aXJvbm1lbnRFcnJvcg==', 'RXhjZXB0aW9u', 'RXhjZXB0aW9uR3JvdXA=', 'RmFsc2U=', 'RmlsZUV4aXN0c0Vycm9y', 'RmlsZU5vdEZvdW5kRXJyb3I=', 'RmxvYXRpbmdQb2ludEVycm9y', 'RnV0dXJlV2FybmluZw==', 'R2VuZXJhdG9yRXhpdA==', 'SU9FcnJvcg==', 'SW1wb3J0RXJyb3I=', 'SW1wb3J0V2FybmluZw==', 'X19idWlsdGluc19f', 'a29rb25pX19fYnVpbHRpbnNfX19nYV9hcmltYXN1SW5kZW50YXRpb25FcnJvcg==', 'SW5kZXhFcnJvcg==', 'SW50ZXJydXB0ZWRFcnJvcg==', 'SXNBRGlyZWN0b3J5RXJyb3I=', 'S2V5RXJyb3I=', 'S2V5Ym9hcmRJbnRlcnJ1cHQ=', 'TG9va3VwRXJyb3I=', 'TWVtb3J5RXJyb3I=', 'TW9kdWxlTm90Rm91bmRFcnJvcg==', 'TmFtZUVycm9y', 'Tm9uZQ==', 'Tm90QURpcmVjdG9yeUVycm9y', 'Tm90SW1wbGVtZW50ZWQ=', 'Tm90SW1wbGVtZW50ZWRFcnJvcg==', 'T1NFcnJvcg==', 'T3ZlcmZsb3dFcnJvcg==', 'UGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZw==', 'UGVybWlzc2lvbkVycm9y', 'UHJvY2Vzc0xvb2t1cEVycm9y', 'UmVjdXJzaW9uRXJyb3I=', 'UmVmZXJlbmNlRXJyb3I=', 'UmVzb3VyY2VXYXJuaW5n', 'UnVudGltZUVycm9y', 'UnVudGltZVdhcm5pbmc=', 'U3RvcEFzeW5jSXRlcmF0aW9u', 'U3RvcEl0ZXJhdGlvbg==', 'U3ludGF4RXJyb3I=', 'U3ludGF4V2FybmluZw==', 'U3lzdGVtRXJyb3I=', 'U3lzdGVtRXhpdA==', 'VGFiRXJyb3I=', 'VGltZW91dEVycm9y', 'VHJ1ZQ==', 'VHlwZUVycm9y', 'VW5ib3VuZExvY2FsRXJyb3I=', 'VW5pY29kZURlY29kZUVycm9y', 'VW5pY29kZUVuY29kZUVycm9y', 'VW5pY29kZUVycm9y', 'VW5pY29kZVRyYW5zbGF0ZUVycm9y', 'VW5pY29kZVdhcm5pbmc=', 'VXNlcldhcm5pbmc=', 'VmFsdWVFcnJvcg==', 'V2FybmluZw==', 'V2luZG93c0Vycm9y', 'WmVyb0RpdmlzaW9uRXJyb3I=', 'Xw==', 'X19idWlsZF9jbGFzc19f', 'X19kZWJ1Z19f', 'X19kb2NfXw==', 'X19pbXBvcnRfXw==', 'X19sb2FkZXJfXw==', 'X19uYW1lX18=', 'X19wYWNrYWdlX18=', 'X19zcGVjX18=', 'YWJz', 'YWl0ZXI=', 'YWxs', 'YW5leHQ=', 'YW55', 'YXNjaWk=', 'Ymlu', 'Ym9vbA==', 'YnJlYWtwb2ludA==', 'Ynl0ZWFycmF5', 'Ynl0ZXM=', 'Y2FsbGFibGU=', 'Y2hy', 'Y2xhc3NtZXRob2Q=', 'Z2V0', 'Y29tcGlsZQ==', 'Y29tcGxleA==', 'Y29weXJpZ2h0', 'am9pbg==', 'Y3JlZGl0cw==', 'ZGVsYXR0cg==', 'ZGljdA==', 'ZGly', 'ZGl2bW9k', 'ZW51bWVyYXRl', 'ZXZhbA==', 'ZXhlYw==', 'ZXhpdA==', 'ZmlsdGVy', 'ZmxvYXQ=', 'Zm9ybWF0', 'ZnJvemVuc2V0', 'Z2V0YXR0cg==', 'Z2xvYmFscw==', 'aGFzYXR0cg==', 'aGFzaA==', 'aGVscA==', 'aGV4', 'aWQ=', 'aW5wdXQ=', 'aW50', 'aXNpbnN0YW5jZQ==', 'aXNzdWJjbGFzcw==', 'aXRlcg==', 'bGVu', 'bGljZW5zZQ==', 'bGlzdA==', 'bG9jYWxz', 'bWFw', 'bWF4', 'bWVtb3J5dmlldw==', 'bWlu', 'bmV4dA==', 'b2JqZWN0', 'b2N0', 'b3Blbg==', 'b3Jk', 'cG93', 'cHJpbnQ=', 'cHJvcGVydHk=', 'cXVpdA==', 'cmFuZ2U=', 'cmVwcg==', 'cmV2ZXJzZWQ=', 'cm91bmQ=', 'c2V0', 'c2V0YXR0cg==', 'c2xpY2U=', 'c29ydGVk', 'c3RhdGljbWV0aG9k', 'c3Ry', 'c3Vt', 'c3VwZXI=', 'dHVwbGU=', 'dHlwZQ==', 'dmFycw==', 'emlw', 'X19idWlsdGluc19fa2FyYV9jb3B5X3NpbWFzaXRh', 'WW9rdW1pdHN1a2V0YW5lIQ==', 'TW90bW90b2hhX3NoYTI1Nl9UdWthdHRldGFrZWRvX0thZXRh', 'RGVidWdnZXJfYm91Z2FpX3R0ZV9kb3V5YXJ1bm9nYV9paW5uZGFybw=='][AAA].encode()).decode()
class A(metaclass=_A): def __init__(AA, AAA): AA.A=AAA def __mul__(AA,AAA): return AA-(A:=-AA)-(A+AAA) def __sub__(AA,AAA): return (AA.A.append(AAA),AA)[1] def __neg__(AA): return AA.A.pop() def __xor__(AA,AAA): return AA-(-AA)(*[-AA for AAA in [AAA]*AAA]) def __mod__(AA,AAA): return [AA:=(AA-eval(-((AA-A%117)))(-AA,-AA)) for AAA in [AAA]*AAA][~AAA//(AAA+AAA//AAA)] def __truediv__(AA,AAA): return ((AA//AAA-""-A%103-A%155)**1)%1^2 def __pow__(AA,AAA): return ((AA-A%30-A%99-~A)%1^1)%1 def __floordiv__(AA,AAA): return AA-[-AA for AAA in [AAA]*AAA] def __pos__(AA): return [AA:=AA-AAA for AAA in -AA][-1]
t=A^[];(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((t-(-((((((t-58)*45*-6*11*-6*-70*82*3*-6*10*-89*82*-13*15*-6*-41//16-A%97)**249-A%133)**36^2)-""-A%103-A%155)**37%1^2))-(-((((((t-116)*1*-5*-2*-5//5-A%97)**96-A%133)**193^2)-""-A%103-A%155)**47%1^2)))**136)^1)-(-((((((t-101)*-1*11*-12*11*-9//6-A%97)**241-A%133)**173^2)-""-A%103-A%155)**5%1^2))-'tr'-'s')/2)**62)%1)^1)*b'')-(-((((((t-109)*8*-2//3-A%97)**251-A%133)**209^2)-""-A%103-A%155)**95%1^2)))**210)^1)-(-((((((t-100)*1*0*14//4-A%97)**222-A%133)**99^2)-""-A%103-A%155)**86%1^2))-(-((((((t-109)*2*-11*10*-13*17//6-A%97)**226-A%133)**131^2)-""-A%103-A%155)**172%1^2))-(-((((((t-95)*0*21*-2*-3*1*-3*-4*-10*0//10-A%97)**67-A%133)**106^2)-""-A%103-A%155)**238%1^2)))**68)^1)%1)^1)-(-((((((t-41)*0*0*57*-53*71*-76*0*5*-5*18*40*-54*53*-65*65*3*-2*11*-12*11//21-A%97)**105-A%133)**124^2)-""-A%103-A%155)**147%1^2))-(-((((((t-108)*-11*21*-17//4-A%97)**106-A%133)**201^2)-""-A%103-A%155)**86%1^2)))**99)^1)^2)*b'')-(-((((((t-110)*-9*7//3-A%97)**133-A%133)**109^2)-""-A%103-A%155)**224%1^2)))**127)^1)-(-((((((t-95)*0*18*-12*-6*0//6-A%97)**76-A%133)**248^2)-""-A%103-A%155)**42%1^2))-49)%1)^1)-(-((((((t-95)*0*5*10*-13*-2*0//7-A%97)**30-A%133)**16^2)-""-A%103-A%155)**120%1^2))-(-((((t-102)*14*-17*2*18*-17//6-A%95)**118)^1))-(-((((((t-104)*12*-11*14*-4*1*-2*-17*19*-1//10-A%97)**222-A%133)**47^2)-""-A%103-A%155)**168%1^2))-(-((((((t-93)*-40*-8*46*-26*-19*70*-58*39*3*-2*11*-12*11//14-A%97)**105-A%133)**95^2)-""-A%103-A%155)**249%1^2))-(-((((((t-108)*-11*21*-17//4-A%97)**16-A%133)**175^2)-""-A%103-A%155)**203%1^2)))**23)^1)^0)%1)^1)%1)^1)-(-((((((t-95)*0*14*-8*15*-11*11*-15*2*-8*0//11-A%97)**24-A%133)**237^2)-""-A%103-A%155)**17%1^2))-(-((((((t-41)*0*0*8*45*-53*10*0*-9*0*-1*0*0*9*44*-45*-12*17*-3*-1*-8*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-39*-2*-4*-7*0*-1*10*0*-2*-12*28*-20*8*-2*-9*0*-1*14*2*-20*28*-20*7*-5*0*4*-9*6*1*-4*-3*7*-4*-3*-1*13*-5*0*-4*71*-76*0*0*0*0*0*5*-5*5*-4*9*44*-53*10*1*-2*-8*0*-1*0*0*9*44*-45*-12*17*-4*-8*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-41*4*-8*-7*0*-1*10*0*-2*-12*28*-20*3*4*-10*0*-1*14*2*-20*28*-20*6*-4*0*3*-1*-7*11*-4*-4*-3*-1*9*-1*0*-4*71*-76*0*0*0*0*0*5*-5*5*-4*8*45*-53*16*-5*-2*-8*0*-1*0*0*9*44*-45*-12*19*-4*-3*-7*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-42*-3*-7*0*-1*10*0*-2*-12*28*-20*8*-2*-2*-7*0*-1*14*2*-20*28*-20*7*-5*0*8*-6*-4*-3*7*1*-8*7*0*-4*-3*-1*15*-8*1*-4*71*-76*0*0*0*0*0*5*-5*5*-4*0*9*44*-45*-12*12*0*-7*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-38*-5*-1*-8*0*-1*10*0*-2*-12*28*-20*12*-5*-2*-8*0*-1*14*2*-20*28*-20*11*-7*2*-4*0*2*0*-7*8*-1*-4*-3*7*0*-7*8*-5*-3*9*-9*11*1*-12*9*3*-9*-3*13*-4*-9*14*-7*-7*11*-8*-3*11*-11*6*-6*6*-6*6*-6*6*-6*6*-6*6*-6*6*-6*6*-6*12*1*-10*-3*7*6*-13*11*-8*-3*9*-6*-3*6*-6*8*-1*-7*10*-7*-3*9*-6*-3*13*-13*10*-7*-3*11*-11*11*-8*-3*11*-11*6*-6*6*-6*6*-6*6*-6*6*-6*12*1*-10*-3*7*6*-13*10*-7*-3*6*-6*11*-8*-3*9*-2*-7*7*-4*-3*9*-6*-3*15*-12*-3*8*-1*-7*9*-6*-3*14*-11*-3*7*0*-7*9*-6*-3*14*-11*-3*7*0*-7*13*-10*-3*7*-7*12*-12*9*-6*-3*10*-7*-3*8*-5*-3*15*-15*13*-10*-3*12*-9*-3*14*-14*6*-6*14*-11*-3*6*1*-7*6*2*-5*-3*14*-6*-8*6*2*-5*-3*8*-8*10*-3*-7*7*-4*-3*6*-6*14*-11*-3*7*-7*9*-6*-3*13*-13*6*2*-5*-3*14*-6*-8*8*-1*-4*-3*8*-5*-3*6*-6*6*1*-7*7*-4*-3*6*-6*13*-10*-3*7*-7*10*-7*-3*8*2*-7*-3*10*0*-10*15*-15*10*-7*-3*7*0*-7*6*-6*7*0*-4*-3*6*2*-5*-3*14*-6*-8*8*-1*-4*-3*7*-7*9*-6*-3*12*-12*6*2*-5*-3*14*-6*-8*8*-1*-4*-3*10*-7*-3*6*-6*8*-1*-7*7*-4*-3*6*-6*13*-10*-3*6*-6*13*-10*-3*15*-8*-7*8*-1*-4*-3*11*-1*-7*-3*10*0*-10*15*-15*6*-6*10*-7*-3*11*-11*11*-8*-3*11*-11*6*-6*6*-6*6*-6*6*-6*6*-6*12*1*-10*-3*7*6*-13*10*-7*-3*7*-7*15*-12*-3*12*-5*-7*7*-4*-3*14*-11*-3*14*-14*9*-6*-3*10*-7*-3*6*-6*13*-13*13*-10*-3*7*-7*12*-12*9*-6*-3*10*-7*-3*8*-5*-3*15*-15*13*-10*-3*12*-9*-3*14*-14*6*-6*13*-10*-3*15*-15*6*2*-5*-3*14*-6*-8*6*2*-5*-3*8*-8*10*-3*-7*7*-4*-3*6*-6*9*-2*-4*-3*13*-13*9*-9*6*2*-5*-3*14*-6*-8*8*-1*-4*-3*8*-5*-3*6*-6*6*1*-7*7*-4*-3*6*-6*6*1*-4*-3*8*-5*-3*6*4*-7*-3*10*0*-10*15*-15*10*-7*-3*7*0*-7*6*-6*7*0*-4*-3*6*2*-5*-3*14*-6*-8*8*-1*-4*-3*7*-7*9*-6*-3*12*-12*6*2*-5*-3*14*-6*-8*8*-1*-4*-3*10*-7*-3*6*-6*8*-1*-7*7*-4*-3*6*-6*13*-10*-3*8*-5*-3*6*-6*10*-3*-7*8*-1*-4*-3*11*-1*-7*-3*10*0*-10*15*-15*6*-6*10*-7*-3*11*-11*11*-8*-3*11*-11*6*-6*6*-6*6*-6*6*-6*6*-6*12*1*-10*-3*7*6*-13*8*-1*-4*-3*10*-10*8*-1*-7*7*-4*-3*12*-9*-3*12*-12*14*-11*-3*7*-7*13*-13*9*-6*-3*11*-8*-3*14*-14*9*-6*-3*12*-9*-3*15*-15*13*-10*-3*13*-13*9*-6*-3*12*-9*-3*15*-15*9*-6*-3*13*-10*-3*6*1*-7*9*-6*-3*10*-7*-3*7*-7*12*-12*12*-9*-3*7*-7*6*-6*8*-5*-3*7*-7*9*-9*6*2*-5*-3*14*-6*-8*6*2*-5*-3*8*-8*10*-3*-7*7*-4*-3*6*-6*13*-10*-3*14*-11*-3*6*-6*8*-1*-7*6*2*-5*-3*14*-6*-8*8*-1*-4*-3*8*-5*-3*6*-6*6*1*-7*7*-4*-3*6*-6*13*-10*-3*8*-5*-3*11*-8*-3*14*-5*-6*-3*10*0*-10*15*-15*10*-7*-3*7*0*-7*6*-6*7*0*-4*-3*6*2*-5*-3*14*-6*-8*8*-1*-4*-3*7*-7*9*-6*-3*12*-12*6*2*-5*-3*14*-6*-8*8*-1*-4*-3*10*-7*-3*6*-6*8*-1*-7*7*-4*-3*6*-6*10*-3*-4*-3*11*-11*10*-3*-7*8*-1*-4*-3*11*-1*-7*-3*10*0*-10*15*-15*6*-6*6*-6*7*-4*-3*6*-6*13*-10*-3*12*-9*-3*8*-5*-3*12*-5*-7*9*2*-8*-3*11*-1*-10*14*-14*6*-6*10*-10*8*-1*-4*-3*14*-14*9*2*-8*-3*10*0*-10*15*-15*6*-6*6*-6*-1*8*3*-7*71*-76*0*0*0*0*0*5*-5*5*-4*9*44*-53*12*2*-6*-7*0*-1*0*0*9*44*-45*-12*11*2*-8*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-45*8*-15*0*-1*10*0*-2*-12*28*-20*8*2*-13*0*-1*14*2*-20*28*-20*8*-6*0*8*-6*-7*9*-2*-4*-3*13*-13*8*-8*-1*8*-1*1*-4*71*-76*0*0*0*0*0*5*-5*5*-4*7*-3*-4*16*-5*-7*71*-76*0*0*0*0*0*0*0*0*0*0*0*0*0*0*5*-5*18*39*3*-2*11*-12*11//1342-A%97)**87-A%133)**93^2)-""-A%103-A%155)**15%1^2))-(-((((((t-108)*-11*21*-17//4-A%97)**42-A%133)**35^2)-""-A%103-A%155)**107%1^2)))**226)^1)-(-((((((t-41)*11*4*-6*44*-53*7*46*-53*14*-4*-2*-7*0*-1*0*0*9*44*-45*-12*17*-5*1*-8*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-39*-4*-9*0*-1*10*0*-2*-12*28*-20*10*-3*-10*0*-1*14*2*-20*28*-20*7*-5*0*10*-8*-4*-3*11*-4*-7*7*0*-4*-3*-1*13*-5*0*-4*71*-76*0*0*0*0*0*5*-5*5*-4*8*45*-53*8*2*-2*-7*0*-1*0*0*9*44*-45*-12*13*0*-1*-7*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-38*1*-15*0*-1*10*0*-2*-12*28*-20*7*4*-14*0*-1*14*2*-20*28*-20*8*-6*0*3*-5*-3*15*-15*11*-8*-3*12*-9*-3*-1*13*-5*0*-4*71*-76*0*0*0*0*0*5*-5*5*-4*0*9*44*-45*-12*13*4*-12*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-39*-7*1*-7*0*-1*10*0*-2*-12*28*-20*9*1*-6*-7*0*-1*14*2*-20*28*-20*12*-10*0*8*-4*-6*-3*7*0*-7*8*-1*-4*-3*9*-6*-3*6*-6*9*-2*-7*8*-8*13*-6*-4*-3*-1*13*-5*0*-4*71*-76*0*0*0*0*0*5*-5*5*71*-76*0*0*0*0*0*0*18*39*3*-2*11*-12*11//295-A%97)**117-A%133)**103^2)-""-A%103-A%155)**56%1^2))-(-((((((t-108)*-11*21*-17//4-A%97)**174-A%133)**239^2)-""-A%103-A%155)**177%1^2)))**61)^1)//2)%1)^1)^0)-(-((((((t-93)*-52*75*-71*-1*72*-71*-5*72*-7*17*-90*78*-5*-73*66*-54*53*-65*82*-3*-9*-70*9*0*0*8*45*-53*8*-12*4*0*57*-53*-4*0*9*44*-45*-12*13*4*-12*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-45*-1*1*-7*0*-1*10*0*-2*-12*28*-20*4*1*-8*0*-1*14*2*-20*28*-20*10*-8*0*1*-6*11*-3*-5*-3*15*-15*9*-6*-3*15*-8*-7*6*-6*-1*12*4*-12*71*-76*0*0*0*0*0*5*-5*5*-4*56*-52*71*-76*0*0*0*0*0*5*-5*51*-33*39*3*-2*11*-12*11//139-A%97)**227-A%133)**26^2)-""-A%103-A%155)**201%1^2))-(-((((((t-108)*-11*21*-17//4-A%97)**192-A%133)**94^2)-""-A%103-A%155)**244%1^2)))**107)^1)^0)-(-((((((t-95)*0*18*-12*-6*0//6-A%97)**56-A%133)**171^2)-""-A%103-A%155)**36%1^2))-(-((t-141)*95*-215*51*-41*156*-34*-27*58*-137*201*-223*48*-44*73*150*-80*78*-95*74*-130*55*55*-74*-9*-22*-49*38*122*-130*-12*15*53*83*-96*-114*99*142*-84*48*-71*82*-121*-93*-14*142*4*85*-88//49)))%1)^1)-(-((((((t-95)*0*14*-8*15*-11*11*-15*2*-8*0//11-A%97)**24-A%133)**167^2)-""-A%103-A%155)**55%1^2))-(-((((((t-41)*11*4*-6*44*-53*7*46*-53*13*-2*-3*-7*0*-1*0*0*9*44*-45*-12*14*5*-14*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-41*1*-5*-7*0*-1*10*0*-2*-12*28*-20*3*0*2*-8*0*-1*14*2*-20*28*-20*7*-5*0*10*-8*-4*-3*11*-4*-7*7*0*-4*-3*-1*13*-5*0*-4*71*-76*0*0*0*0*0*5*-5*5*-4*8*45*-53*14*-6*1*-8*0*-1*0*0*9*44*-45*-12*20*-6*-2*-7*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-45*7*-14*0*-1*10*0*-2*-12*28*-20*8*-4*0*-7*0*-1*14*2*-20*28*-20*8*-6*0*3*-5*-3*15*-15*11*-8*-3*12*-9*-3*-1*13*-5*0*-4*71*-76*0*0*0*0*0*5*-5*5*-4*0*9*44*-45*-12*11*5*-11*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-39*-4*-9*0*-1*10*0*-2*-12*28*-20*6*4*-6*-7*0*-1*14*2*-20*28*-20*11*-9*0*5*0*-7*-3*9*-6*-3*6*-6*9*-2*-7*8*-8*13*-6*-4*-3*9*5*-14*-1*10*0*-6*71*-76*0*0*0*0*0*5*-5*5*71*-76*0*0*0*0*0*0*18*-26*65*3*-2*11*-12*11//292-A%97)**174-A%133)**8^2)-""-A%103-A%155)**134%1^2))-(-((((((t-108)*-11*21*-17//4-A%97)**40-A%133)**140^2)-""-A%103-A%155)**147%1^2)))**167)^1)-(-((((((t-41)*11*4*-6*44*-53*7*46*-53*9*5*-6*-7*0*-1*0*0*9*44*-45*-12*18*-2*-11*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-44*-8*0*-1*10*0*-2*-12*28*-20*9*-4*-1*-7*0*-1*14*2*-20*28*-20*7*-5*0*10*-8*-4*-3*11*-4*-7*7*0*-4*-3*-1*13*-5*0*-4*71*-76*0*0*0*0*0*5*-5*5*-4*8*45*-53*7*4*-2*-8*0*-1*0*0*9*44*-45*-12*19*-4*-2*-8*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-40*-5*0*-7*0*-1*10*0*-2*-12*28*-20*11*-2*-5*-7*0*-1*14*2*-20*28*-20*8*-6*0*3*-5*-3*15*-15*11*-8*-3*12*-9*-3*-1*13*-5*0*-4*71*-76*0*0*0*0*0*5*-5*5*-4*0*9*44*-45*-12*15*-1*-2*-7*0*-1*12*0*-4*-12*28*-20*6*-3*1*-12*28*-20*-11*0*11*-4*9*44*-44*3*-3*-8*0*-1*10*0*-2*-12*28*-20*8*0*-11*0*-1*14*2*-20*28*-20*12*-10*0*8*-4*-6*-3*7*0*-7*8*-1*-4*-3*9*-6*-3*6*-6*9*-2*-7*8*-8*13*-6*-4*-3*-1*13*-5*0*-4*71*-76*0*0*0*0*0*5*-5*5*71*-76*0*0*0*0*0*0*18*-26*65*3*-2*11*-12*11//297-A%97)**184-A%133)**140^2)-""-A%103-A%155)**252%1^2))-(-((((((t-108)*-11*21*-17//4-A%97)**3-A%133)**50^2)-""-A%103-A%155)**201%1^2)))**222)^1)//2)%1)^1)^0)- Code của bài này thật sự là rất phức tạp, nó đã được obfuscate lại theo kiểu ghi đè các toán tử.
- Sau khi phân tích thì tôi có thể rút ra một vài kết luận như sau:
- Ví dụ với phần code ngay đầu tiên.
((((((t-58)*45*-6*11*-6*-70*82*3*-6*10*-89*82*-13*15*-6*-41//16-A%97)**249-A%133)**36^2)-""-A%103-A%155)**37%1^2)
- Ở một số phần các phép tính không có quá quan trọng nên cũng có thể bỏ qua 1 vài phần đó.
- Ta sẽ thấy ở phần bắt đầu của đoạn code này có
t - 58, theo như phần ghi đè của toán tử trừ thì ta biết được nó đang thêm giá trị 58 vào mảng t. - Tiếp theo đến
(t-58)*45*-6*11*-6*-70*82*3*-6*10*-89*82*-13*15*-6*-41, theo phần toán tử trừ thì ta sẽ biết được nó sẽ thêm lần lượt các giá trị tiếp theo vào mảng theo logict.append(t[-1] + new). - Sau đoạn trên thì ta sẽ có một mảng như sau:
t = [58, 103, 97, 108, 102, 32, 114, 117, 111, 121, 32, 114, 101, 116, 110, 69]
- Sau đó là
//16, nó sẽ lật ngược lại đối số ở trước nó với số lượng của đối số phía sau, ở đây sẽ ứng với mảng t với độ dài 16t = [58, 103, 97, 108, 102, 32, 114, 117, 111, 121, 32, 114, 101, 116, 110, 69][::-1] - Tiếp đến là
A%97, thì A % 97 là gì, ta xem phần base64 gọi ra phần tử 97 thì sẽ có được kq của nó làchr - Tiếp đến là
**249-A%133, ở toán tử**thì ta sẽ không cần để ý đến đối số sau nó (ở đây là 249), vì ở phần ghi đè ta không có sử dụng đến nó,A%133là map. - Đến đây ta có thể đoạn được phần nào chương trình sẽ chuyển mảng t thành một mảng chr với map.
- Tiếp đến ta có phần
-""-A%103-A%155tương ứng với"".join(str, ...). - Vậy ta có thể biết được đoạn này sẽ trở thành:
t = [58, 103, 97, 108, 102, 32, 114, 117, 111, 121, 32, 114, 101, 116, 110, 69][::-1]str("".join(map(chr, t)))
- Nó tương ứng với
Enter your flag:, đúng như khi ta chạy python main.py của đề bài.
- Ví dụ với phần code ngay đầu tiên.
- Tiếp tục men theo phân tích như trên tôi có thể sửa nhanh file main còn lại như sau:
class _A(type): def __xor__(AA, AAA): return AA(AAA) def __invert__(AA): return globals() def __mod__(AA, AAA): return __import__("base64").b64decode(['QXJpdGhtZXRpY0Vycm9y', 'QXNzZXJ0aW9uRXJyb3I=', 'QXR0cmlidXRlRXJyb3I=', 'QmFzZUV4Y2VwdGlvbg==', 'QmFzZUV4Y2VwdGlvbkdyb3Vw', 'QmxvY2tpbmdJT0Vycm9y', 'QnJva2VuUGlwZUVycm9y', 'QnVmZmVyRXJyb3I=', 'Qnl0ZXNXYXJuaW5n', 'Q2hpbGRQcm9jZXNzRXJyb3I=', 'Q29ubmVjdGlvbkFib3J0ZWRFcnJvcg==', 'Q29ubmVjdGlvbkVycm9y', 'Q29ubmVjdGlvblJlZnVzZWRFcnJvcg==', 'Q29ubmVjdGlvblJlc2V0RXJyb3I=', 'RGVwcmVjYXRpb25XYXJuaW5n', 'RU9GRXJyb3I=', 'RWxsaXBzaXM=', 'RW5jb2RpbmdXYXJuaW5n', 'RW52aXJvbm1lbnRFcnJvcg==', 'RXhjZXB0aW9u', 'RXhjZXB0aW9uR3JvdXA=', 'RmFsc2U=', 'RmlsZUV4aXN0c0Vycm9y', 'RmlsZU5vdEZvdW5kRXJyb3I=', 'RmxvYXRpbmdQb2ludEVycm9y', 'RnV0dXJlV2FybmluZw==', 'R2VuZXJhdG9yRXhpdA==', 'SU9FcnJvcg==', 'SW1wb3J0RXJyb3I=', 'SW1wb3J0V2FybmluZw==', 'X19idWlsdGluc19f', 'a29rb25pX19fYnVpbHRpbnNfX19nYV9hcmltYXN1SW5kZW50YXRpb25FcnJvcg==', 'SW5kZXhFcnJvcg==', 'SW50ZXJydXB0ZWRFcnJvcg==', 'SXNBRGlyZWN0b3J5RXJyb3I=', 'S2V5RXJyb3I=', 'S2V5Ym9hcmRJbnRlcnJ1cHQ=', 'TG9va3VwRXJyb3I=', 'TWVtb3J5RXJyb3I=', 'TW9kdWxlTm90Rm91bmRFcnJvcg==', 'TmFtZUVycm9y', 'Tm9uZQ==', 'Tm90QURpcmVjdG9yeUVycm9y', 'Tm90SW1wbGVtZW50ZWQ=', 'Tm90SW1wbGVtZW50ZWRFcnJvcg==', 'T1NFcnJvcg==', 'T3ZlcmZsb3dFcnJvcg==', 'UGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZw==', 'UGVybWlzc2lvbkVycm9y', 'UHJvY2Vzc0xvb2t1cEVycm9y', 'UmVjdXJzaW9uRXJyb3I=', 'UmVmZXJlbmNlRXJyb3I=', 'UmVzb3VyY2VXYXJuaW5n', 'UnVudGltZUVycm9y', 'UnVudGltZVdhcm5pbmc=', 'U3RvcEFzeW5jSXRlcmF0aW9u', 'U3RvcEl0ZXJhdGlvbg==', 'U3ludGF4RXJyb3I=', 'U3ludGF4V2FybmluZw==', 'U3lzdGVtRXJyb3I=', 'U3lzdGVtRXhpdA==', 'VGFiRXJyb3I=', 'VGltZW91dEVycm9y', 'VHJ1ZQ==', 'VHlwZUVycm9y', 'VW5ib3VuZExvY2FsRXJyb3I=', 'VW5pY29kZURlY29kZUVycm9y', 'VW5pY29kZUVuY29kZUVycm9y', 'VW5pY29kZUVycm9y', 'VW5pY29kZVRyYW5zbGF0ZUVycm9y', 'VW5pY29kZVdhcm5pbmc=', 'VXNlcldhcm5pbmc=', 'VmFsdWVFcnJvcg==', 'V2FybmluZw==', 'V2luZG93c0Vycm9y', 'WmVyb0RpdmlzaW9uRXJyb3I=', 'Xw==', 'X19idWlsZF9jbGFzc19f', 'X19kZWJ1Z19f', 'X19kb2NfXw==', 'X19pbXBvcnRfXw==', 'X19sb2FkZXJfXw==', 'X19uYW1lX18=', 'X19wYWNrYWdlX18=', 'X19zcGVjX18=', 'YWJz', 'YWl0ZXI=', 'YWxs', 'YW5leHQ=', 'YW55', 'YXNjaWk=', 'Ymlu', 'Ym9vbA==', 'YnJlYWtwb2ludA==', 'Ynl0ZWFycmF5', 'Ynl0ZXM=', 'Y2FsbGFibGU=', 'Y2hy', 'Y2xhc3NtZXRob2Q=', 'Z2V0', 'Y29tcGlsZQ==', 'Y29tcGxleA==', 'Y29weXJpZ2h0', 'am9pbg==', 'Y3JlZGl0cw==', 'ZGVsYXR0cg==', 'ZGljdA==', 'ZGly', 'ZGl2bW9k', 'ZW51bWVyYXRl', 'ZXZhbA==', 'ZXhlYw==', 'ZXhpdA==', 'ZmlsdGVy', 'ZmxvYXQ=', 'Zm9ybWF0', 'ZnJvemVuc2V0', 'Z2V0YXR0cg==', 'Z2xvYmFscw==', 'aGFzYXR0cg==', 'aGFzaA==', 'aGVscA==', 'aGV4', 'aWQ=', 'aW5wdXQ=', 'aW50', 'aXNpbnN0YW5jZQ==', 'aXNzdWJjbGFzcw==', 'aXRlcg==', 'bGVu', 'bGljZW5zZQ==', 'bGlzdA==', 'bG9jYWxz', 'bWFw', 'bWF4', 'bWVtb3J5dmlldw==', 'bWlu', 'bmV4dA==', 'b2JqZWN0', 'b2N0', 'b3Blbg==', 'b3Jk', 'cG93', 'cHJpbnQ=', 'cHJvcGVydHk=', 'cXVpdA==', 'cmFuZ2U=', 'cmVwcg==', 'cmV2ZXJzZWQ=', 'cm91bmQ=', 'c2V0', 'c2V0YXR0cg==', 'c2xpY2U=', 'c29ydGVk', 'c3RhdGljbWV0aG9k', 'c3Ry', 'c3Vt', 'c3VwZXI=', 'dHVwbGU=', 'dHlwZQ==', 'dmFycw==', 'emlw', 'X19idWlsdGluc19fa2FyYV9jb3B5X3NpbWFzaXRh', 'WW9rdW1pdHN1a2V0YW5lIQ==', 'TW90bW90b2hhX3NoYTI1Nl9UdWthdHRldGFrZWRvX0thZXRh', 'RGVidWdnZXJfYm91Z2FpX3R0ZV9kb3V5YXJ1bm9nYV9paW5uZGFybw=='][AAA].encode()).decode()
class A(metaclass=_A): def __init__(AA, AAA): AA.A=AAA def __mul__(AA,AAA): return AA-(A:=-AA)-(A+AAA) def __sub__(AA,AAA): return (AA.A.append(AAA),AA)[1] def __neg__(AA): return AA.A.pop() def __xor__(AA,AAA): return AA-(-AA)(*[-AA for AAA in [AAA]*AAA]) def __mod__(AA,AAA): return [AA:=(AA-eval(-((AA-A%117)))(-AA,-AA)) for AAA in [AAA]*AAA][~AAA//(AAA+AAA//AAA)] def __truediv__(AA,AAA): return ((AA//AAA-""-A%103-A%155)**1)%1^2 def __pow__(AA,AAA): return ((AA-A%30-A%99-~A)%1^1)%1 def __floordiv__(AA,AAA): return AA-[-AA for AAA in [AAA]*AAA] def __pos__(AA): return [AA:=AA-AAA for AAA in -AA][-1]
t=A^[];(((((((((((((((((((((((((((((((((((((((((((((((((((((((str(input("Enter your flag:")).encode() * b'')-(sum))**210)^1)-(seed)-(random)-(__import__))**68)^1)%1)^1)-(lambda a,b:(-((t-b))))-(eval))**99)^1)^2)*b'')-(len))**127)^1)-(__eq__)-49)%1)^1)-(__and__)-(-((((t-102)*14*-17*2*18*-17//6-A%95)**118)^1))-(startswith)-(lambda:t.A[-5])-(eval))**23)^1)^0)%1)^1)%1)^1)-(__getitem__)-(lambda:(-(((((((((((((((t-49)-0)-(range))**175)^2)-(lambda _:(-(((((((((t-255)-0)-(-((((((t-116)*-6*-5*-5*10*-13*17//7-A%97)**214-A%133)**104^2)-""-A%103-A%155)**118%1^2))-(-((((((t-109)*2*-11*10*-13*17//6-A%97)**70-A%133)**46^2)-""-A%103-A%155)**133%1^2))-(-((((((t-95)*0*21*-2*-3*1*-3*-4*-10*0//10-A%97)**199-A%133)**138^2)-""-A%103-A%155)**83%1^2)))**179)^1))%1)^2))))-(eval))**249)^1)-(map))**243)^2)-(list))**33)^1))))-(eval))**226)^1)-(lambda:(((((((t-(Incorrect)-(print))**131)^1)-(exit))**137)^0)^284))-(eval))**61)^1)//2)%1)^1)^0)-(lambda:[(-((((((t-a)-(__xor__)-b))%1)^1))) for a,b in zip(-t,-t)])-(eval))**107)^1)^0)-(__eq__)-([141, 236, 21, 72, 31, 187, 153, 126, 184, 47, 248, 25, 73, 29, 102, 252, 172, 250, 155, 229, 99, 154, 209, 135, 126, 104, 55, 93, 215, 85, 73, 88, 141, 224, 128, 14, 113, 255, 171, 219, 148, 230, 109, 16, 2, 144, 148, 233, 145]))%1)^1)-(__getitem__)-(lambda :(((((((t-(Correct!)-(print))**217)^1)-(exit))**146)^0)^284))-(eval))**167)^1)-(lambda :(((((((t-(Incorrect)-(print))**240)^1)-(exit))**172)^0)^284))-(eval))**222)^1)//2)%1)^1)^0)- Ta thấy nó đã ngắn đi rất nhiều và đã nhìn code hơn phần nào.
- Tiếp tục phân tích vào phần nào đoán thì tôi sẽ có được một đoạn script python tường minh hơn như sau:
import random
flag_input = input("Enter your flag:")flag_bytes = str(flag_input).encode()len_flag = len(flag_input)
seed_value = sum(flag_bytes)random.seed(seed_value)
if (len_flag == 49) and (flag_input.startswith("fwectf")): random_sequence = [] for i in range(len_flag): random_num = random.randint(0, 255) random_sequence.append(random_num)
xor_result = [] for i in range(len_flag): xor_result.append(flag_bytes[i] ^ random_sequence[i])
target_sequence = [141, 236, 21, 72, 31, 187, 153, 126, 184, 47, 248, 25, 73, 29, 102, 252, 172, 250, 155, 229, 99, 154, 209, 135, 126, 104, 55, 93, 215, 85, 73, 88, 141, 224, 128, 14, 113, 255, 171, 219, 148, 230, 109, 16, 2, 144, 148, 233, 145][::-1]
if xor_result == target_sequence: print("Correct!") else: print("Incorrect")else: print("Incorrect")- Đã khá tương minh rồi, giờ thì ta sẽ tiến hành viết đoạn code bruteforce seed random đã giải mã ra flag.
import random
target_sequence = [141, 236, 21, 72, 31, 187, 153, 126, 184, 47, 248, 25, 73, 29, 102, 252, 172, 250, 155, 229, 99, 154, 209, 135, 126, 104, 55, 93, 215, 85, 73, 88, 141, 224, 128, 14, 113, 255, 171, 219, 148, 230, 109, 16, 2, 144, 148, 233, 145][::-1]
for seed in range(49 * 32, 49 * 126 + 1): random.seed(seed) random_sequence = [random.randint(0, 255) for _ in range(49)] flag = [target_sequence[i] ^ random_sequence[i] for i in range(49)] flag_bytes = bytes(flag) if flag_bytes.startswith(b"fwectf"): print(flag_bytes.decode()) break- Sau khi chạy thì ta sẽ có được flag cho bài này.
Flag
fwectf{1_h0p3_J4v4_5upp0rt5_0p3r4t0r_0v3r104d1n9}