문제:

Unpack을 한 후 Serial을 찾으시오.
정답인증은 OEP + Serial
Ex) 00400000PASSWORD

 

무작정 실행을 해봤는데

틀렸다고 한다.. ㅎㅎ 그러면 디버거를 통해서 "Wrong serial" 문자열 검색 후 그 전 후를 살펴보면 되겠다.

 

immunity debugger를 통해 열어봤더니 PUSHAD라는 명령어를 보았다,, 패킹 되어있단 뜻이다!! (문자열검색이 안된다.)

exeinfope를 통해 확인해본 결과이다. 

upx 를 가지고 언패킹해보았다. (upx -d 파일경로)

그리고 나서 immunity debugger를 가지고 다시한번 실행해보았다.

OEP가 뭔지 몰라서 찾아보니까 프로그램 실행 시작점인데 처음 켜보니 저기였다.

OEP: 00401360 이다.

 

이제 "Wrong serial!!!" 이라는 문자열을 검색해보겠다. (Search for -> all referenced text strings -> search for text)

엔터키를 이용해서 돌아올 수 있다.

Wrong serial!!! 말고 You got it ;)으로 가기위한 노력을 해보도록 하자,,

 

00401030에 F2를 이용해서 break point를 걸고 F9를 이용해 그 곳까지 빠르게 실행해보도록 하겠다.

아까와 같은 메세지 박스가 뜨는데 왠지 수상해보이는 저어기 아스키값을 넣고 Check Serial을 눌러보자.(AD46DFS547)

F8을 이용해 계속 가다가 GetDlgItemTextA 라는 함수를 만났다. 뭔지 몰라서 검색해보니 

내가 쓴 저 문자열을 가져오는 함수같다. return 값으로 문자열의 길이를 eax에 저장한다.

직후의 eax 값이다. 내가 쓴 문자열의 길이가 10이니까 0xA가 저장된다.

그리고 004235D4에 내가 쓴 값을 저장하고 stack에 push 한다.

이 함수 직후의 eax값은 0이다. 같으면 0 아니면 FFFFFFFF를 반환한다. ( 일반적으로 반환값을 eax에 저장한다. )

난 같으니까 0이 저장되었다.

TEST EAX, EAX를 통해서 EAX가 0인 것을 확인하고 0이면 JNZ을 만족하지 않아서 jmp 하지 않는다.

004010A3은 Wrong~~~~~~~~을 띄워주는 메세지 박스 준비코드 ㅜㅜ

 

TEST 명령어는 and 연산으로 진행한다. 이렇게 되면 eax & eax 니까 eax가 0인지를 확인하는 것이다.

JNZ는 zero flag가 0일때 뛰는 건데 TEST 명렁어에 의해 ZF가 1이 되어버려서 안뛰게 되었다.

jmp하지 않고 계속 실행되는 코드를 보면 You got it ;) 을 담는 메세지박스를 준비하는 코드다~~

MessageBoxA 함수까지 실행시키고 보면

기분 좋은 메세지를 얻을 수 있다~

 

답: 00401360AD46DFS547

'Forensics > Reversing' 카테고리의 다른 글

[CodeEngn 10] Basic RCE L10  (0) 2020.02.25
[CodeEngn 08] Basic RCE L08  (0) 2020.02.23
[CodeEngn 07] Basic RCE L07  (0) 2020.02.23