コンテンツにスキップ

Easy as GDB

tl;dr

可逆変換

解法

例によって、Ghidra と IDA で必死こいて解析します。

結果、以下のようなチェックである事が分かります。

st=input()

assert len(st)==30

x=0xabcf00d

x1,x2,x3,x4=0,0,0,0
while x<0xdeadbeef:
    x1^=(x>>24)%0x100
    x2^=(x>>16)%0x100
    x3^=(x>>8)%0x100
    x4^=x%0x100
    x+=0x1fab4d

for i in range(30):
    if i%4==0:
        st[i]^=x1
    elif i%4==1:
        st[i]^=x2
    elif i%4==2:
        st[i]^=x3
    else:
        st[i]^=x4

for i in range(1,30):
    x=len(a)//i*i
    for j in range(0,x,i):
        st[j],st[j+i-1]=st[j+i-1],st[j]

a=[0x7A,0x2E,0x6E,0x68,0x1D,0x65,0x16,0x7C,0x6D,0x43,0x6F,0x36,0x63,0x62,0x14,0x47,0x43,0x63,0x40,0x63,0x58,0x01,0x58,0x33,0x62,0x3F,0x53,0x30,0x6D,0x17]

for i in range(30):
    assert a[i]==st[i]

あとは、逆変換をするだけです。

a=[0x7A,0x2E,0x6E,0x68,0x1D,0x65,0x16,0x7C,0x6D,0x43,0x6F,0x36,0x63,0x62,0x14,0x47,0x43,0x63,0x40,0x63,0x58,0x01,0x58,0x33,0x62,0x3F,0x53,0x30,0x6D,0x17]

for i in range(len(a)-1,0,-1):
    genkai=len(a)//i*i
    for j in range(genkai-i,-1,-i):
        a[j],a[j+i-1]=a[j+i-1],a[j]


x=0xabcf00d

x1,x2,x3,x4=0,0,0,0
while x<0xdeadbeef:
    x1^=(x>>24)%0x100
    x2^=(x>>16)%0x100
    x3^=(x>>8)%0x100
    x4^=x%0x100
    x+=0x1fab4d

for i in range(len(a)):
    num=a[i]
    if i%4==0:
        num^=x1
    elif i%4==1:
        num^=x2
    elif i%4==2:
        num^=x3
    else:
        num^=x4
    print(chr(num),end='')

最終更新日: 2021年4月8日