ROOTME PYC-BYTECODE

2018. 5. 19. 02:220x02 Reverse Engineer/0x03. Etc

728x90

Python중에 pyc로 되어 있어서 pyc decompiler를 이용하였다.


파이썬 역분석을 처음 해봐서 엄청 해맸다.


문제를 보면 KEY값이 하드코딩 되어있고,


사용자가 입력한 PASS를 통해 KEYOUT를 생성할 수 있다.


파이썬의 ord는 문자의 코드 값을 구하는 함수이다. 

이를 chr로 변환하여 풀었다. 코드를 많이 변환하지 않고 결과가 SOLUCE와 같아야 하기 때문에 

SOLUCE를 인자로 삼고 브루트포싱 했다.. 


후 오래걸렸다. 


문제:

print('Welcome to the RootMe python crackme')

PASS = raw_input('Enter the Flag: ')

KEY = 'I know, you love decrypting Byte Code !'

I = 5

SOLUCE = [

        57,

        73,

        79,

        16,

        18,

        26,

        74,

        50,

        13,

        38,

        13,

        79,

        86,

        86,

        87]

KEYOUT = []

for X in PASS:

KEYOUT.append((ord(X) + I ^ ord(KEY[I])) % 255)

        I = (I + 1) % len(KEY)

    if SOLUCE == KEYOUT:

        print('You Win')

    else:

        print('Try Again !')

print SOLUCE

print "-----------"

        print KEYOUT




풀이 :

SOLUCE = [

        57,

        73,

        79,

        16,

        18,

        26,

        74,

        50,

        13,

        38,

        13,

        79,

        86,

        86,

        87]


def main():

print('Welcome to the RootMe python crackme')

#PASS = raw_input('Enter the Flag: ')

print("TAKE A BRUTE FORCE GET A FLAG")

print get_flag(SOLUCE)


def get_flag(SOLUCE):

KEY = 'I know, you love decrypting Byte Code !'

I = 5

KEYOUT = ''


# pass is brute force 

# pass[0] = X[0] ?? 

for X in range (len(SOLUCE)):

for Y in range(128):

if (Y + I ^ ord(KEY[I])) % 255 == SOLUCE[X]:

KEYOUT += chr(Y)

break

##

I = (I+1) % len(KEY)


return KEYOUT



if __name__ == '__main__':

main()


'0x02 Reverse Engineer > 0x03. Etc' 카테고리의 다른 글

ROOTME ARM  (0) 2018.05.19
ROOTME NO SOFTWARE BREAKPOINTS  (0) 2018.05.19
ROOTME ELF PTRACE  (0) 2018.05.19
ROOTME FAKE INSTRUCTION  (0) 2018.05.19
KISA Diary 문제풀이 및 상세분석  (0) 2018.05.18