CodeEngn Reversing Basic_Level05

이름과 키를 입력해야 한다. 디버거로 돌리기 전에 PEiD로 체크해 보았다.

UPX 패킹이 되어있다. 패킹을 풀어주자.

upx 패킹을 풀어준 뒤 다시 PEiD로 체크해 보았다. 더 이상 패킹은 없는 것 같다.

그럼 올리 디버거로 돌려보자.

search for all referenced text string을 이용하여 string을 찾아보았다. 쓸만한 문자열이 여럿 보인다. 일단 성공 메시지와 실패 메시지에 breakpoint를 걸어보았다.

디폴트로 세팅된 입력값을 그대로 두고 실행시켰더니 오류 메시지가 있는 곳에서 멈췄다. 같은 오류 메시지가 두 가지 있는데, 위의 오류 메시지에는 걸리지 않고 아래에 걸렸다. 두 오류가 다른가? 다르다면, 분기되는 지점을 찾고 싶다.

커서를 조금 올렸더니 분기되는 지점이 보인다. JNZ를 이용하여 분기하고, 위에서는 어떤 함수가 호출되고 있다. 그 함수에는 인자로 Local.1(EBP-4)과 “Registered User” 문자열이 입력된다.

Local.1이 무슨 값인지 보니 이름 란에 입력한 값이다. 아무래도 입력값과 “Registered User”를 비교하는 것 같다. breakpoint를 걸고, 이름 입력값에 “Registered User”를 넣어 다시 실행해 보았다.

인자를 넣는 부분에 bp를 걸고 함수를 call했더니, JNZ에서 분기하지 않는다. 그대로 진행하면 이번엔 Local.1과 “GFX-754-IER-954” 문자열을 넣고 똑같은 함수를 call 한다.

그런데 좀 전 이름 비교에서 Local.1에는 입력한 이름이 들어가 있었다. 그래서 Local.1 영역을 주목하며 프로그램을 진행시켜 보았다.

두 비교 코드 사이에 있는 또 다른 Call 을 지나니 Local.1에 프로그램에 디폴트로 들어가 있는, 입력값 시리얼 키가 들어갔다.

비교하기 전, 입력값을 스택에 올리는 함수였다. “GFX-754-IER-954”가 키로 보이니 입력값을 바꾸어 넣어보자.

성공했다. 따라서 flag는 GFX-754-IER-954이다.


tags: writeup, reversing, pe file, windows, packing, upx packer, x86asm