OLD 2018 ~ 2021/BASIC → Hacking

170119_REVERSING(3)_snake

pogn 2018. 1. 18. 02:56

Concept 

python 바이트 코드


파이썬은 하이브리트 인터프리터 언어로, 컴파일러와 인터프리터를 보두 사용한다. 

프로그램을 실행할 때 먼저, 프로그램을 바이트 코드로 어셈블링 한 다음, 파이썬 인터프리터에서 실행할 수 있다. 

이때, dis 모듈은 클래스, 메소드, 함수 및 코드 객체를 디스 어셈블 하여 사람이 읽을 수 있는 

python 바이트 코드를 만들 수 있다 .


     [ python source code ] --> [ byte code ]  -->  인터프리터에서 해석 





marshal 모듈 


"internal python object serialization " 을 위한 모듈이다. 

즉, marshal 포맷에 맞추어 데이터를 가용성있게 만드는 것을 Serialize( =직렬화 )라고 한다.

( 메모리에 올라가는 데이터는 직렬화 되어야 네트워크를 통해 보낸다던가 하는 활동을 할 수 있다.)


데이터 파일이 marshal 포맷을 가지고 있는 경우, marshal.dump로 실행가능한 파일로 인식된다. 


marshal. dump  :      ( 바이트 코드 )   -->  ( 데이터 파일 ) 로 저장

                                                           변수, 문자열, 객체 

                                                                            혹은, 파일                  


marshal. load    :       ( 데이터 파일 )   -->  ( 바이트 코드 ) 




dis 모듈

바이트 코드를 디스어셈블링 해주는 모듈이다. 



Hands-on Practice 

주어진 문제 파일은 pyc 파일로, 컴파일된 파이썬 스크립트 파일이었다. 

IDA에서 디컴파일이 되지 않았기 때문에 구글링을 통해 디컴파일 프로그램을 찾아서 디컴파일 했다. 



파일을 열어보니 아래와 같이 base64로 디코딩 하는 루틴이 보였다. 




디코더를 통해 디코딩을 하니, 아래와 같은 알 수 없는 문자열에서 'ROT13'가 눈에 띄었고, 
ROT13으로 복호화를 하였으나, 플래그의 일부만을 구할 수 있었다. 



위의 파이썬 코드에서 marshal은 메모리에 올라가 있는 객체(스트림)를 파일로 저장할 때 쓰이는 것이다. 
즉, 저 코드는 문자열로 가지고 있던 값을 base64로 디코딩 하여, 메모리에 올리고 실행하는 코드이다. 

검색해 본 결과 파이썬 바이트 코드라는게 있었고 
dis라는 모듈을 통해 바이트 코드를 디스어셈블 할 수 있었다. 

위의 코드를 dis 모듈을 이용해서 디스어셈블 해서 





ROT13으로 디크립트 하니 플래그 문자열을 발견할 수 있었다. 
flag:{jdR6khbsn4KAh1}


cf) 
새로운 스크립트를 짜서 바이트 코드를 스트링으로 넘겨주면 python2에서는 에러를 띄워버리고, 



python3에서는 ascii문자열을 인식하지 못한다. (자동 컴파일?.... 기능이 추가되서 3만 되는 거라는데 왜그런건지는 잘 모르겟다...)






Reference 
- marshal 관련 man page


- marshal 개념 소개

 

- python disassembler man page


- python 바이트 코드란