2018. 5. 19. 02:22ㆍ0x02 Reverse Engineer/0x03. Etc
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 |