Index
앞선 위 포스팅에서 pyinstaller를 이용하여 파이썬 코드를 노출하지 않을 수 있는 방법을 설명했다. 하지만, 툴을 이용하면 원래 소스코드를 확인 할 수 있다.
이전에 만들었던 퀴즈 프로그램을 통해 직접 실습 해볼 것이다.
0x00
pyinstaller로 실습 exe 파일 생성
pyinstaller --onefile profile_problem.py
해당 python 파일의 이름은 profile_problem.py
이다. 먼저, pyinstaller를 이용해서 실행 파일로 만든다.
경로에 build와 dist 폴더가 생성된 것을 확인할 수 있다.
.\dist\profile_problem\
폴더로 들어가면 profile_problem.exe
파일이 있다.
실행 시에도 문제풀이 게임이 잘 실행된다. py 파일 안에는 문제의 정답을 비교하고 있지만, exe 파일로 변환되어서 확인할 수 없다. 이를 다시 py파일로 변환시켜서 소스 코드를 확인해보자.
0x01
필요한 툴
- pyinstxtractor.py 설치 (https://sourceforge.net/project/pyinstallerextractor)
- HxD Editor (https://mh-nexus.de/en/hxd/)
- uncompyle6 (pip3 install uncompyle6)
0x02
pyinstxtractor.py (download)
pyinstaller로 만든 exe 파일을 디컴파일 해준다.
python pyinstxtractor.py profile_problem.exe
실행한 경로에 profile_problem.exe_extracted
이라는 폴더가 생성되었을 것이다.
위 파일 중에 프로그램 이름과 동일한 파일이 있을 것이다. 우리는 이 파일을 수정하여 원본 소스 코드를 찾아낼 것이다. 먼저, 이 파일을 HxD 툴에 던져보자.
0x03
HxD로 파일 형식 분석 및 시그니처 추가
위와 같은 형식을 가지고 있다. pyinstaller는 py 파일을 exe로 변환시키고 파일 시그니처를 지운다. 그러니, 소스 파일의 버전을 확인하여 파일 시그니처를 앞에 추가해주면 소스 코드를 확인 가능하다.
42 0D 0D 0A 01 00 00 00 00 00 00 00 00 00 00 00
위 Hex 값으로도 소스 코드가 확인되는 경우도 있지만, pyinstaller가 실행된 버전에 따라 달라질 수 있기 때문에, base_library.zip 파일 안에 있는 pyc 파일로도 확인이 가능하다.
앞서 profile_problem
파일과 비교해보면 E3 00 ~
앞에 16바이트로 구성된 시그니처가 있는 것을 확인할 수 있다. 이를 시그니처 값을 앞선 파일 맨 앞에 추가해서 pyc 파일로 저장해보자.
.pyc 파일로 잘 저장되었으면, uncompyle6 모듈을 통해 소스코드를 확인할 수 있다.
0x04
uncompyle6 모듈을 통한 소스코드 확인
uncompyle6 profile_source.pyc
퀴즈를 구성한 클래스를 확인할 수 있고, 문제를 확인해보니 첫번째 문제는 이예준
, 두번째 문제는 정보보호학전공
인 것을 확인했다. 문제를 실행해서 해결해보자.
0x05
문제 해결
앞서 확인했던 소스 코드와 동일한 실행된 문제가 나왔으며, 우리는 문제의 답이 설정된 것을 알기 때문에, 쉽게 문제를 해결할 수 있었다. 실행 파일을 만든다고, 코드 전체가 숨겨지는 것은 아니기 때문에, 파이썬으로 만들어진 프로그램을 공유할 때는 조심해야 할 것 같다. 또한, 암호화를 통해 실행 파일로 묶는 방법을 사용하면 좋을 것 같다.
0x06
암호화된 키 값 확인
pyinstaller로 exe로 만들 때, 옵션을 통해 암호키를 입력하여 암호화 할 수 있다.
pyinstaller --clean -n PIE --key=jbuctf --onefile --noconsole pie.py
이 파일 역시 0x02의 pyinstxtractor.py 툴로 돌려준다.
에러가 발생한다. 암호화로 인해 발생하는 것이다.
위 사진과 같이 폴더는 동일하게 생성된다.
crypto_key 라는 파일이 있고, 이 파일을 HxD에 열어보자.
아까 위에서 pyinstaller 시 사용했던 키 문자열 값을 확인 할 수 있다. 에러는 났어도, 실행파일에 앞선 과정을 적용하면, 소스코드도 동일하게 나온다.
Uploaded by N2T