CTF/리버싱

[HouseplantCTF] SQUEEZY - 리버싱 / Python / Base64 / XOR

SecurityMan 2022. 6. 15. 11:00


계속해서 이어지는 python 리버싱 문제

Ok this time, you aren't getting anywhere near anything

자꾸 쉬운 문제만 내면서 멘트는 엄청난 각오를 다지고 있는게 귀엽다.

반응형


주어지는 문제파일은 pass3.py 파일이다.

 


먼저 IDLE을 이용해 py파일을 한번 실행시켜 봤다.

역시나 이번에도 패턴은 똑같다.

Enter the password: 라는 문구가 나오고,

123을 입력해봤더니 Incorrect password! 라는 문구가 나오면서

저번처럼 약올리는듯한 멘트를 출력한다.

import base64
def checkpass():
  userinput = input("Enter the password: ")
  key = "meownyameownyameownyameownyameownya"
  a = woah(key,userinput)
  b = str.encode(a)
  result = base64.b64encode(b, altchars=None)
  if result == b'HxEMBxUAURg6I0QILT4UVRolMQFRHzokRBcmAygNXhkqWBw=':
      return True
  else:
      return False

def main():
    access = checkpass()
    if access == True:
        print("Unlocked. The flag is the password.")
        print("pwease let me do my nya~ next time!!")
        exit()
    else:
        print("Incorrect password!")
        print("sowwy but now you gunnu have to listen to me spweak in cat giwrl speak uwu~")
        catmain()

def catmain():
    access = catcheckpass()
    if access == True:
        print("s-senpai... i unwocked it fowr you.. uwu~")
        print("t-the fwlag is... the password.. nya!")
        exit()
    else:
        print("sowwy but that wasnt quite rwight nya~... pwease twy again")
        catmain()

def catcheckpass():
  userinput = input("pwease enter youwr password... uwu~ nya!!: ")
  key = "meownyameownyameownyameownyameownya"
  a = woah(key,userinput)
  b = str.encode(a)
  result = base64.b64encode(b, altchars=None)
  if result == b'HxEMBxUAURg6I0QILT4UVRolMQFRHzokRBcmAygNXhkqWBw=':
      return True
  else:
      return False

def woah(s1,s2):
    return ''.join(chr(ord(a) ^ ord(b)) for a,b in zip(s1,s2))
access = False
main()


pass3.py 파일의 전체 내용은 위와 같다.

역시나 뭔가 길어보이지만,

실행되지 않는 쓸데없는 코드들이 너무 많아서 그렇게 보이는것 뿐이다.

 


이번에도 똑같은 패턴이다.

main 함수를 먼저 살펴보면

access 변수에 checkpass() 변수의 실행 결과를 담아주고,

access에 담긴 값이 True 경우 플래그를 획득할 수 있다.

checkpass() 함수를 살펴보자.

 


그래도 이번 문제는 조금 생각을 하게끔 만들어 놨다.

가장 먼저 userinput 변수에 사용자가 입력한 값을 담아주고,

key 라는 변수를 선언해서 그안에 meownyameownyameownyameownyameownya 라는 값을 넣어줬다.

그다음 key와 userinput 변수를 woah() 함수의 인수로 전달하는데

 

 

woah() 함수는 단순히 두 인수를 XOR(^) 해주는 역할을 한다.

마지막으로 XOR한 값을 base64로 인코딩해서 result 변수에 담아주고,

그 값이 HxEMBxUAURg6I0QILT4UVRolMQFRHzokRBcmAygNXhkqWBw= 이면 True를 리턴한다.

복잡해보이지만 역시 천천히 역으로 계산해주면 아주 쉽게 풀린다.

간단하게 식으로 표현해보면

base64encode(userinput ^ key) = result 이니

역으로 계산하면

base64decode(result) ^ key = userinput 이 될것이다.

 


CyberChef(https://gchq.github.io/CyberChef)에서 쉽게 해결할 수 있다.

먼저 base64 인코딩된 값을 디코딩 해주고(1)

Key 값으로 meownyameownyameownyameownyameownya 을 넣어준 뒤 XOR을 해주면(2)

플래그를 찾을 수 있다.

 


프로그램을 실행시키고 password에 플래그를 넣어주면

정상적으로 Unlocked 라고 뜨는걸 볼 수 있다.

반응형