woonadz :)

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

IT/codeengn 문제 풀이

[CodeEngn Basic] RCE L09 문제 풀이_nabi

C_scorch 2021. 10. 8. 19:49
반응형

기록용

3줄 TMI

9번 풀이는 어제,엊그제 2일동안 거의 5시간 동안 작성하고 푼 문제였고(내가 다른 블로그 풀이를 이해하는데도 오래 걸렸고 ollydump를 다운받을 때도 많이 힘들었다.) 시간이 부족해서 밥도 안먹고 작성했던 풀이인데 진짜.. 아까 글 수정하려다 실수로 삭제를 눌러서 현재 2번째 풀고 쓰고 있다.


StolenByte를 구하시오 Ex) 75156A0068352040

 

StolenByte 란?

프로그램의 어떤 부분의 코드를 다른 부분으로 옮긴 코드이다. 조금 더 쉽게 말하면 옮겨지는 코드들은 대부분 OEP 위에 코드들이 JMP 구문으로 OEP에 도달하기 전 코드들이다. 주로 패킹과 동시에 이루어지는 것 같다. (왜 이렇게 인터넷에 정확한 정보가 없는지... 빨리 영어 열심히 공부해서 외국문서들을 참고할 수 있게 해야겠다.) 

 

이제 프로그램을 실행시켜보겠다.

사실 프로그램이 잘 작동되길래 놀랐다. (이 부분에 대해선 지금 생각하면 창피하다. 그냥 압축이 아니라 패킹을 한거여서 당연히 실행되야 하는건데.. 패킹의 개념과 패킹 여부 확인에 대한 내용은 아래 포스팅을 참고하길 바란다.)

https://scorchingnraining.tistory.com/entry/CodeEngn-Basic-RCE-L05-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4nabi

 

[CodeEngn Basic] RCE L05 문제 풀이_nabi

기록용 3줄 TMI 순서대로 문제 풀이 포스팅을 올리고 싶었지만 지금 밀린 과제나 해야할 것들이 많아서 일단 5,6을 먼저 올려야 될 것 같다. 2,3,4는 다음주 중에 한번 더 풀어서 올려야겠다. 추석

scorchingnraining.tistory.com

 

이제 올리디버거에 프로그램을 올려 분석해주겠다.

 

코드들을 실행시켜줘도 큰 변화가 일어나지 않고 무엇보다 주석,힌트 등 코드들이 수상하게 생겼다.(사실 이런 추상적인 말 쓰는 거 정말 싫어하는데 인터넷에도 정확한 정보가 나와있지 않다... 빨리 나뭇잎 책을 사는 수밖에)

 

이제 ExeinfoPE 프로그램에 이 파일을 올려 패킹이 된게 맞는지 확인해주겠다.

 

아래쪽 두 줄을 확인해보면 이 파일이 UPX로 패킹되어있기 upx.exe -d 명령어로 언패킹을 진행해줘야 한다는 것을 알 수 있다. 어차피 언패킹을 진행해줘도 코드가 완전하지 않아 제대로 된 프로그램이 실행되지 않을 걸 알기에 이 부분은 패스하겠다.

 

사실 해봤었다...

이렇게 프로그램이 제대로 실행되지 않는다.

 

ollydbg에 다시 파일을 올려 분석을 진행해주겠다.(OEP를 찾는게 급하다.)

OEP를 찾는 방법은 아래 블로그 포스팅에 잘 나와있으니 참고하셨으면 한다.

https://honorlog.tistory.com/5

 

[CodeEngn] Basic RCE L05 (+α UPX 패킹 상태에서 OEP 찾는 법)

● CodeEngn Basic RCE L05 문제 ◎ 파일 실행 화면 "Wrong Serial,try again!" 문자열을 찾고 분기점을 찾으면 될 것 같습니다. 분기를 판별하는 코드가 등록키와 입력된 키를 비교하는 것으로 추정됩니다. ◎

honorlog.tistory.com

오른쪽 마우스 -> Search for -> All commands -> popad 입력 후 검색을 통해 pushad에 인접한 popad 주소로 이동해주겠다.

 

popad 명령어 주소에 BP를 걸고 거기까지 실행시키면 아까 뜬 오류 문자열이 나타난다. 좀 이상한 점이 있다면 메시지 박스 함수가 보이지 않고 문자열만 떡하니 있다는 것이다. 

 

코드 가장 마지막 줄을 확인해보면 JMP 명령어가 있다는 것을 알 수 있다. JMP 명령어로 이동하는 주소가 OEP이다. OEP로 이동해보겠다.

 

이동하니 이곳에도 수상한 주소가 보인다. 0040100E 주소와 메시지 박스를 호출하는 다른 주소들과의 차이점을 보면 push로 인자를 한개 밖에 받지 않았다. 기본적으로 MessageBox를 호출할 때는 파라미터 4개를 받아준다. 앞에서 수상했던 코드들의 주소들을 다시 확인하면 push 명령어로 3개의 값들을 스택에 넣어주고 12바이트라는 것을 볼 수 있다. OEP위에 붕 뜨는 주소들의 바이트 값을 확인하면 12바이트라는 것을 알 수 있다. 그래서 JMP 명령어 전에 있던 push 명령어로 구성된 3 주소가 stolenbyte 라고 추측 할 수 있다.

(MessageBox에 대한 설명은 마이크로소프트 문서를 참고해주시면 될 것 같다.)

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxa

 

MessageBoxA function (winuser.h) - Win32 apps

Displays a modal dialog box that contains a system icon, a set of buttons, and a brief application-specific message, such as status or error information. The message box returns an integer value that indicates which button the user clicked.

docs.microsoft.com

 

JMP 명령어 전에 있던 push 명령어를 쓰는 주소 3줄을 긁어오겠다. 기계어 코드를 긁어와 오른쪽 마우스 -> Bianry -> Edit 에 기계어 코드를 붙여주면 된다.

 

이제 수정된 코드들을 덤프로 저장해주겠다.(덤프는 따로 다운받아 plugin 폴더에 넣어주어야한다.)

 

엔트리포인트가 새롭게 바뀌었으니 1000으로 수정해준다. 덤프를 눌러 새로운 파일로 저장해주고 정상적으로 작동하는지 실행시켜보겠다.

 

 

잘 실행된다.

 

따라서 답 StolenByte는 OP코드인 6A0068002040006812204000 이다.

 

 

끝인사 및 느낀점

진짜 힘들고 풀고 진짜 힘들게 쓴 이 글을 실수로 삭제했을 때 눈물이 진짜 앞을 가렸다...ㅋㅋㅋㅋㅋ

그래도 9번 문제를 한번 더 풀면서 패킹,언패킹 개념을 정확히 외우게 되었고 나쁜지만은 않은 것 같다.(긍정적으로 생각하려고 한다.) 리버싱 문제를 풀면 풀수록 빨리 방학 때 나뭇잎 책으로 심화를 공부하고 싶은 마음이 커진다. StolenByte 라던지 등등 인터넷에 나와있는 리버싱 관련 개념들이 너무 두루뭉실한? 그럼 느낌을 크게 받았다. 제대로 된 정보로 정확한 공부를 하고 싶다.

반응형