문제:
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 |