CCE2023 ping pong

Osori·2023년 6월 13일
1

Write-up

목록 보기
2/3
post-thumbnail

(그림체는 이렇지만 굉장히 재밌는 애니다... 강추!!!)

CCE 2023에서 풀었던 문제들을 복기해보려고 한다. 먼저 다운받은 파일을 실행시키면
아래와 같은 탁구 게임이 실행이 된다.

이것만 가지고는 아무것도 알 수 없긴 한데 종료할 때 힌트가 나온다. 누가봐도 Python 으로 작성됐다고 광고하는중이다.

PyInstaller 로 실행파일로 만들어진 파이썬 코드라고 생각을 해서 먼저 압축 해제를 해주었다. PyInstaller reversing 등으로 검색하면 많은 자료가 나오고 나는 가장 위에 노출된
PyInstaller Extractor 를 이용해주었다.

파일 목록중에서 우리가 봐야될 것은 ping_pong.pyc 파일이다.
파이썬은 uncompyl6를 이용해서 원본 코드의 복원이 가능한 경우도 있어서 희망을 품었지만,
3.11 버전은 지원이 안된다는 듯.... 결국 바이트코드 분석에 들어갔다.
pycdc 를 이용하면 pyc 파일을 디스어셈블리 할 수 있다.
이 파일을 분석하면서 흥미로운 부분을 발견 하였고score_one 이 153, score_two 가 42일 때 실행되는 get_key 함수의 실행이 목적이 되었다.

처음 내가 생각한 것은 치트엔진을 이용해서 메모리 검색을 통해서 값을 바꿔주는 것이였는데, 파이썬에는 정수 문자열 저장이 좀 다른 방법을 이용하는지 검색이 안되는 것 같았다.
그래서 다른 방법을 썼다.
게임 시작시에는 스코어를 0으로 초기화 해주는데, 이 부분의 바이트 코드를 수정하는 것이였다.
파이썬은 사용되는 상수, 변수들을 테이블에 넣어서 사용한다. 코드에 나온 것처럼 0: 0, 40:153, 41:42 등이 이에 해당한다.

그러면 LOAD_CONST 의 헥스코드를 알아내서 0(인덱스) 를 41,42 로 수정해주면 되겠다는 생각이 들었다. 또한 score_one, score_two 또한 26, 27인덱스로 저장되있는 변수들이기 때문에 찾는 것은 그리 어렵지 않았다.

0x28, 0x29 가 10진수로 41, 42에 해당되며 수정된 부분이다.
위처럼 ping_pong.pyc 파일을 수정하고 난 뒤 실행하니 처음 시작시 스코어가 153 : 42로 시작하며 플래그가 출력됐다.

profile
해킹, 리버싱, 게임 좋아합니다

0개의 댓글

관련 채용 정보