본 포스팅은 리버싱 핵심원리 통칭 '나뭇잎책'에서 나오는 예제로 주는 문제중 'Lena's Reversing for Newbies'문제를 풀이한 포스팅이다.
Lena's Reversing For Newbies문제를 다운로드 받으면 ReverseMe1.zip 이라는 파일을 받게 된다. 해당 파일의 압축을 해제 하면 그림 1과 같이 TutReverseMe1.exe과 TutReverseMe12.exe와 Msvbvm50.dll파일을 얻게 된다. Msvbvm50.dll은 만든 년도로 봤을때 마이크로소프트에서 제작한 dll이다. 뉴비를 위한 문제라고 하니까 Dll injection같은 문제는 아닐 테니 바로 진행하겠다. Msbvm50.dll파일이 있는 곳에서 Tut ReverseMe1.exe을 실행해 주겠다.
참고로 TutReverMe12.exe는 실행이 되지 않는다.
파일을 실행시키면 [그림 2]와 같이Nag Screen메세지창이 뜨면서 Nags를 제거하고 올바른 생성 코드를 입력하라고 한다.
확인을 누르고 진행을 하면 [그림 3]와 같이 Regcode값을 입력하는 곳이 있고 Nag? 버튼과 Register me!버튼이 있다. Nags버튼을 누르면 다시 [그림 2]와 같은 창이 뜬다. [그림 2]가 Nag인걸로 파악된다. 그렇다면 [그림 2]를 실행시키는 분기를 우회하는 방법으로 파일패치를 진행을 한다면 Nag가 제거가 될 것이다.
Register Me!를 클릭하면 그림 4와 같이 registration code가 잘못되었다고 한다. Registration code를 알아내기 위해서 해당 부분을 디버깅 해야한다는 것을 생각해낼 수 있엇다.
무엇을 확인해야 하고 어디에서 어떤 패치를 해야하는지를 확인했으니, xdbg를 이용해서 디버기을 진행해 보겠다.
모듈을 확인해서 tut.reverseme1.exe가 처음 실행되는 곳으로 이동을 하겠다. 주소 4000으로 이동을 한다.
모듈이 처음으로 호출되는 곳으로 이동을 하면 401000위치로 움직이게 된다[그림 7]. 그 상태로 조금 내리니까 401168오프셋에 EntryPoint가 발견 되고 바로 밑에 Jmp&ThunRTMain이 보인다. 한 단계를 진행한후 40116d로 가면 [그림 2]화면이 출력되게 된다. 그렇다면 저기서 점프로 된 곳 어딘가에 출력문과 메세지 박스 출력구문이 있을거라는 생각을 할 수 있다. msbvm에서 메세지 박스 호출은 rtcMsgBox라는 호출문을 사용한다고 한다.
[그림 9]와 같이 모듈간 호출을 모두 검색해 보면 [그림 10]과 같이 나온다. strcmp로 문자열을 검색하는 부분이 있고, 메세지 박스를 출력하는 공간이 있다. 메세지 박스와 문자열 검색하는 곳에는 전부다 중단점을 설정한다.
이 상태로 프로그램을 실행시켜 보겠다. 첫 번째 중단점은 402cfe에서 rtcmsgbox 거친뒤 실행을 하면 [그림 2]가 나타난다. 그 다음 [그림 3] 상황에서 Nag?를 누르면 또다시 402cfe에서 중단 된다.
[그림 13]을 확인해보면 strcmp에 도착하니 스택에 [그림 12]에서 입력한 문자열 test와 I'mlena151라는 저장값을 확인할 수 있고, esp에 I'mlena151을 찾아 볼 수 있었다.
esp값의 변화에 대해서 자세히 이해할려면 stack frame에 대한 이해가 필요하다. 역시 전 문제와 같이 스택에 대한 자세한 내용은 brush on카테고리에 따로 게시를 하겠다. 간략하게 설명을 하자면 스택의 탑에 있는 값을 가르키게 되는데, 문자열을 비교하는 과정에서 필요한건 입력된 문자열과 변수로 받을 비교문자열이다. 시스템 흐름상 문자열이 입력이 더 먼저 되기 때문에 stack 상황은 test 위에 I'mlena151이 되는 것이고, 현재 스택 상황과 strcmp를 실행할 예정인것으로 미뤄 봤을때, 내가 임의로 입력한 test와 I'mlena151과 비교를 하고 맞으면 정답 문구를 틀리면 에러 문구를 띄어줄 것이다.
즉 registration code는 I'mlena151일 것이다.
엑조디아 카드는 모두 모였으니 조합해서 엑조디아를 소환해 보자. 첫 번째, Nag Screen을 출력하는 주소는 402cfe이다. 402cfe로 이동해서, 해당 스택이 시작되는 곳을 찾아 가겠다.
위로 올라가다보면 push ebp를 찾았다. 해당 위치가 스타트 지점일 테니까 [그림 14]와 같이 함수로 이동한 후에 바로 스택이 정리 되고 return 되기 위해서 retn 4로 변경한후 [그림 3]에서 아무리 Nag?를 눌러도 Nag메세지 창은 뜨지 않는다. 시끄러운 Nag를 없애는데 성공했다.
I'mlena151을 입력하니 '그림 14'와 같이 성공한 것을 볼 수 있다.
이 문제는 아마 stack에 대한 이해도와 파일 패치에 대한 이해도를 묻는 문제였던것 같다.
-----------------------------------------------------------------------------------------------------------------------------------
나중에 되서야지 알게된 이야기이긴 한데, 파일 안에 정해진 패스워드값이 있을경우, 메모리 값들을 보면 정답을 출력하는 문자열 앞에 패스워드 값이 존재한다고 한다. 그래서 직접 hxd를 열어서 확인해보니... 있었다.
오늘도 하나 배워갔다.
'study > write_up' 카테고리의 다른 글
codeEngn.com Basic3 Write_up [DCD-VB5-CrackMe 1.0] (0) | 2021.01.20 |
---|---|
codeEngn.com basic 2 write up [ArturDents CrackMe #1] (0) | 2021.01.19 |
codeEngn.com Basic 1 Write up [abex' 1st crackme] (0) | 2021.01.14 |
pwnable.kr mistake write_up (0) | 2020.01.18 |
pwnable.kr leg write_up (0) | 2020.01.18 |