woonadz :)

[CodeEngn Basic] RCE L05 문제 풀이_nabi 본문

IT/codeengn 문제 풀이

[CodeEngn Basic] RCE L05 문제 풀이_nabi

C_scorch 2021. 9. 25. 19:12
반응형

기록용

3줄 TMI

순서대로 문제 풀이 포스팅을 올리고 싶었지만 지금 밀린 과제나 해야할 것들이 많아서 일단 5,6을 먼저 올려야 될 것 같다. 2,3,4는 다음주 중에 한번 더 풀어서 올려야겠다. 추석 연휴가 있었기에 더 빡세게 밀린 것들을 처리할 수 있을 줄 알았지만 더 신나게 놀아버렸다... 반성하고 다시 정신차려야지...


오늘은 시간이 많이 없기 때문에 빠르게 본론으로 넘어가겠다.

 

이 프로그램의 등록키는 무엇인가

 

값을 입력해도 오류창이 뜨며 등록이 되지 않았다.

아무생각없이 디버거로 열었지만 시작부분부터 이상했다. 힌트창에 엔트리포인트라는 말이 뜨지도 않았고 모든 코드의 주석에도 아무런 내용이 없었다. 이대로 한줄씩 계속 실행시켜보았지만 단지 실행외에는 아무것도 바뀌지 않아 다른 블로그를 보았다. 알고보니 코드가 패킹 된 것이었다.

 

패킹이란?

실행압축이다. 즉, 일반적으로 우리가 알고 있는 압축과는 달리 압축해제 없이 프로그램 실행이 가능하다는 뜻이다.

 

이제 코드를 언패킹해줄 준비를 할 것이다.

ExeInfo PE 라는 프로그램을 다운로드 해줄 것이다.

 

https://url.kr/jb8tuv

 

이곳에서 OpenDrive를 택해 다운받으면 된다.

이제 ExeInfo PE에 PE파일을 넣어주겠다.

아래쪽 줄을 확인하면 UPX으로 패킹되었다는 정보를 얻을 수 있다. 이제 UPX 패커로 언패킹을 진행할 것이다.

 

https://github.com/upx/upx/releases 

 

Releases · upx/upx

UPX - the Ultimate Packer for eXecutables. Contribute to upx/upx development by creating an account on GitHub.

github.com

여기 UPX 패커를 다운받아주면 된다. 프로그램을 다운 받은 후 cmd(명령 프롬프트)에서 설정해줘야 할 것이 있다.

 

upx 프로그램을 저장한 곳으로 이동

cd 명령어를 이용해 upx 프로그램이 저장된 곳으로 이동한다.

 

upx -d 파일명을 통해 언패킹 진행

upx -d 파일명을 통해 파일을 언패킹 해주겠다. 주의할 점이 있다면 upx 압축을 푼 폴더 안에 언패킹을 진행할 파일을 넣어야 한다. (upx --help를 통해 더 많은 관련 명령어들을 볼 수 있다.)

 

한줄씩 실행해보기

한줄씩 실행시켜보면 004412BC 주소에서 메시지 박스가 호출되는 것을 알 수 있다. 위에 칸에 123을 입력하고 아래 칸에 456을 입력해보았더니 잘못되었다는 메시지가 출력되었다.

 

그 다음줄 실행

다음줄을 실행하였더니 서브루틴함수로 들어가졌다. 코드가 끝인 것 같다.

그래서 오른쪽 마우스 클릭 -> Search for -> All referenced text strings 를 통해 이동해보겠다.

 

All referenced text strings 중에서 아까 오류메시지가 뜬 부분을 찾아 이동할 것이다. 더블클릭하면 그 부분 위치를 볼 수 있다.

 

wrong Serial, try again! 이 입력된 부분으로 이동했다. 코드들을 하나 하나 다 읽어보는 건 비효율적이라고 생각해 이 함수 시작 부분에 BP(breakpoint)를 걸어주겠다.

 

이제 F9를 이용해 BP 부분 전까지 실행시켜주겠다.

 

나는 '123'과 '456' 이라는 값을 입력을 해줬기 때문에 "No Name entered" "Enter a Name!" 문자열을 점프된다. 아래로 쭉 한줄씩 실행시켜보겠다.

 

00440F2C 주소를 실행시키자 EAX 레지스터에 내가 입력한 값 '123' 이 들어간 것을 확인 할 수 있다. 계속 한줄씩 실행시켜보겠다.

 

레지스터 값에 주목해주세요

00440F2F 주소를 실행시키자 EDX 레지스터에 파일에 입력 되어있던 아스키 값이 들어간 것을 확인 할 수 있다. 다시 한줄씩 실행시켜보겠다. 

 

JNZ 명령어를 따라 00440F8C 주소로 이동

JNZ 명령어는 제로 플래그가 0이거나 앞의 연산 결과가 0이 아니면 점프하는 명령어이다. 따라서 0040F34 주소의 CALL 명령어가 부르는 주소에는 등록키 값과 사용자가 입력한 값을 비교하는 함수가 들어있다는 것을 추측할 수 있다. 제로 플래그 값을 1로 바꿔 다시 실행해보겠다.

 

00440F49 주소를 실행시키자 EAX 레지스터에 내가 입력한 값 '456' 이 들어간 것을 확인 할 수 있다. 계속 한줄씩 실행시켜보겠다.

 

레지스터 값에 주목해주세요

00440F4C 주소를 실행시키자 EDX 레지스터에 파일에 입력 되어있던 아스키 값이 들어간 것을 확인 할 수 있다. 다시 한줄씩 실행시켜보겠다. 

 

위 설명과 같이 제로플래그 값이 0이기에 00440F72 주소로 이동한 것을 알 수 있다.

 

내가 입력한 '123' 값과 파일에 입력되어있던 'Registered User' 를 비교하여 메시지 창을 불러오고 '456' 값과 파일에 입력되어있던 'GFX-754-IER-954' 를 비교하여 메시지 창을 불러온다는 것을 알았다.

 

따라서 답은 'Registered User','GFX-754-IER-954' 문자열이다.

 

끝인사 및 느낀점

처음부터 이 글을 적으며 함께 문제를 풀었던 건 아니다. 문제를 여러 방법으로 접근해보고 답이 도출되었을 때 포스팅을 적기 시작했다. 인터넷 창을 여러개 켜둔 탓인지, 올리디버거만에 문제인지 포스팅을 적으며 두번째 풀 때는 메시지창 버튼에 문제가 생겨 엄청 힘들었다. 메시지창 버튼이 자꾸 제 역할을 하지 못하고 눌러도 아무 반응이 없었다. 그것때문에 한 1시간 엄청 고생했다. 처음엔 내가 잘못한줄 알고 BP 다 제거하기도 해보고 다른 곳에 BP 설정하고 실행해보기도 하였고 파일을 두번이나 삭제했다가 다시 다운받았다. 그러다가 갑자기 되었는데 왜 된건지 나도 잘 모르겠다...ㅎㅎ 오늘 풀이는 정말 어거지로 푼 느낌이 크긴 한데 다른 블로그에서는 많이 못 본 풀이이기에 거기에 의미를 두려고 한다. 좋은 풀이인지는 사실 잘 모르겠다... 

아 그리고 여담으로 오늘 리버싱 관련 영상 찾다가 화이트 해커의 인터뷰 영상을 유튜브에서 보았는데 기억에 남는 점이 있어 적어보겠다. 해커들이 모여있는 커뮤니티에서 다른 사람들의 도움을 받거나 스승을 찾거나 함께 모의해킹을 해보거나 하는 등의 활동을 해보라는 내용이 있었다. 사실 지금 동아리에서 해킹 기초 공부를 하고 있기에 네이버 카페 등과 같은 커뮤니티를 할 생각을 전혀 못했다. 3주전쯤에 나는 리버싱을 정말 아무런 개념도 없이 C언어 문법 지식만 가지고 동아리 분들과 독학을 시작했다. 동아리 분들도 모두 처음해보는 리버싱 공부라 모르는 개념이나 문제가 나올 때 마다 어디 물어볼 사람도 없었다. 점점 문제가 어려워질수록 답답함만 늘어갔던 찰나에 좋은 정보를 얻은 것 같다. 또 화이트 해커와 크래커의 차이는 정말 거의 없는 것 같다. 불법적인 부분에서 활동하며 개인의 사리사욕을 채우면 크래커고 이에 대응해 방패에 역할을 하는 것이 화이트 해커다. 영상 출연자 분께서 화이트 해커로 남기 위해선 윤리관이 뚜렷해야한다는 말씀을 하셨는데 이 부분이 기억에 크게 남는다. 해킹 건수마다 직장인의 1년치 연봉을 받을 수 있는데 그 유혹을 떨쳐내는 것이 중요하다고 하셨다. 나라면 유혹을 잘 떨쳐낼 수 있을지 김칫국을 마시며 상상을 했다.

혹시 몰라 영상 주소를 첨부하겠다.

https://youtu.be/M78PKBkln4M

 

반응형