[코드엔진] Basic RCE L09 풀이

비얌·2022년 3월 10일
0

어셈블리 게임

목록 보기
7/15
post-thumbnail

코드엔진 Basic RCE L09 문제를 풀어보았다.

문제는 다음과 같다.



StolenByte라는 용어를 처음 들어봐서, 검색을 해보다가 이에 대해 잘 설명한 글을 발견했다.


용어에 대한 설명을 읽었어도 잘 이해하지 못해 다른 풀이의 도움을 받아 풀었다.


풀이를 시작하자면, 일단 Detect It Easy에 올려봤고 UPX로 압축된 것을 확인했다.



그래서 UPX로 압축을 풀어줬다. (사용한 명령어: upx.exe -d -o 새로만들파일 압축해제할파일)


패킹된 파일을 실행해보면 다음과 같은 창이 두 개 뜬다.


그리고 언패킹한 파일을 실행하면 다음과 같이 글자가 깨진 창이 뜬다.



글자가 깨지는 이유는 아래와 같이 MessageBox 함수를 호출하는 부분의 인자값 부분이 NOP으로 채워져있기 때문이라고 한다.

  • 다른 정상적인 파일을 보면 이렇게 정상적인 값들로 채워져있다.

그래서 다른 곳의 정상적인 문자열을 이곳으로 가져올 것이다.

아래는 언패킹을 하기 전 원본 실행파일이다. POPAD 뒤에 MessageBox의 인자값으로 보이는 문자열들이 있다.(StolenByte는 OEP주소로 점프하기 전 위치에서 PUSH된다고 한다. POPAD 뒤에 OEP주소로 점프하는 곳이 있다.) 이 문자열들이 JMP를 통해 원래 소스코드로 돌아가기 전에 스택에 저장되어 있다. JMP를 한 후에는 바로 MessageBox를 호출하게 된다.


저 부분을 복사해서 원래 메세지박스의 NOP부분에 붙여넣어준다.


패치를 마치고 저장 후 실행하면 이전과는 달리 정상적인 창이 뜬다!


+ 그리고 패치한 파일을 IDA로 열어서 분석해보면, 같은 경로에 이름이 abex.12c이고 사이즈가 12바이트인 파일이 있으면 이를 키파일로 간주함을 알 수 있다.

profile
🐹강화하고 싶은 기억을 기록하고 공유하자🐹

0개의 댓글