1. 程式人生 > 實用技巧 >BUU-Splendid_MineCraft

BUU-Splendid_MineCraft

跳轉到了這裡

然後計算得到第一個自解密的首地址

第一個自解密程式碼

#include<idc.idc>

static main()
{
    auto i = 0;
    for(i=0;i<=0x151;i++)
    {
        PatchByte(0x004051FC + i,Byte(0x004051FC + i) ^ 0x72);
    }
}

解密後建立函式,F5 寫指令碼得到第一部分

a = [101,108,99,111,109,101]
b = [51,64,49,98,59,98]
s1 = ''
k = 0
for i in range(6):
    j 
= (a[i] ^ b[i]) + 35 k ^= j s1 += chr(j) print s1

這六個字元(char)異或值(0x20)作為第二個自解密異或值

第二個自解密指令碼

#include<idc.idc>

static main()
{
    auto i = 0;
    for(i = 256; i < 496;i++)
    {
        PatchByte(0x00405018 + i,Byte(0x00405018 + i) ^ 32);
    }
}

這裡的跳轉是 jmp 暫存器 無法被解析 我們直接修改為jmp 地址(注意從add那條指令開始修改 不然要修改到下面的地址)

因為這裡吧add覆蓋了 我們到跳轉點寫一個相同的add

之後後面的跳轉類似 且不會修改到重要彙編程式碼 這裡我把兩處重新命名為 tototo和fofofo 方便寫彙編

然後F5 得到清晰的虛擬碼

可以看到第三部分是明文比較 我們現在只需要第二部分了

但是我還是沒有看懂這部落格裡面的程式碼 自己也寫不出來就用他的吧。。。還是太菜了

https://www.cnblogs.com/harmonica11/p/13073221.html

最後的程式碼如下

a = [101,108,99,111,109,101]
b = [51,64,49,98,59,98]
flag = 'ACTF{'
k = 0
for
i in range(6): j = (a[i] ^ b[i]) + 35 k ^= j flag += chr(j) flag += '_' b=[0x30,0x4,0x4,0x3,0x30,0x63] a="F6 A3 5B 9D E0 95 98 68 8C 65 BB 76 89 D4 09 FD F3 5C 3C 4C 36 8E 4D C4 80 44 D6 A9 01 32 77 29 90 BC C0 A8 D8 F9 E1 1D E4 67 7D 2A 2C 59 9E 3D 7A 34 11 43 74 D1 62 60 02 4B AE 99 57 C6 73 B0 33 18 2B FE B9 85 B6 D9 DE 7B CF 4F B3 D5 08 7C 0A 71 12 06 37 FF 7F B7 46 42 25 C9 D0 50 52 CE BD 6C E5 6F A5 15 ED 64 F0 23 35 E7 0C 61 A4 D7 51 75 9A F2 1E EB 58 F1 94 C3 2F 56 F7 E6 86 47 FB 83 5E CC 21 4A 24 07 1C 8A 5A 17 1B DA EC 38 0E 7E B4 48 88 F4 B8 27 91 00 13 97 BE 53 C2 E8 EA 1A E9 2D 14 0B BF B5 40 79 D2 3E 19 5D F8 69 39 5F DB FA B2 8B 6E A2 DF 16 E2 63 B1 20 CB BA EE 8D AA C8 C7 C5 05 66 6D 3A 45 72 0D CA 84 4E F5 31 6B 92 DC DD 9C 3F 55 96 A1 9F CD 9B E3 A0 A7 FC C1 78 10 2E 82 8F 30 54 04 AC 41 93 D3 3B EF 03 81 70 A6 1F 22 26 28 6A AB 87 AD 49 0F AF" a=a.split() for i in range(len(a)): a[i]=eval("0x"+a[i]) for i in range(6): flag += chr((0x83+i)^a.index(b[i])) flag += '_5mcsM<}' print flag