CodeEngn Reversing Basic_Level06

패킹이 되어있다고 한다. 일단 실행해 보았다.

입력란 하나 버튼 하나가 있다.

아무거나 치고 버튼을 누르면 에러 메시지가 뜬다. referenced string으로 찾아볼 수 있을 것 같다.
우선 PEiD로 패킹의 종류를 알아보았다.

UPX이다. 언팩 해주고 다시 PEiD를 써 보았다.

더이상 패킹은 없는 것으로 보인다.
문제에서 요구하는 OEP는 언팩한 상태에서 실행했을 때, 가장 먼저 시작하는 코드의 주소이다. (Original Entry Point) PEiD의 Entrypoint 부분을 보면 바뀌었다는 것을 알 수 있다. 이는 언팩을 하며 원래 시작할 코드의 주소로 바뀌었기 때문이다.
여기에 imagebase를 더하자.

imagebase가 400000이다. 따라서 OEP는 401360이다. flag 형식을 맞추면 00401360이다.
그냥 올리디버거에서 맨 처음 시작하는 주소를 찾아도 된다.
그럼 이제 올리디버거로 돌려보자.

referenced string에 여러가지 중요한 문자열이 보인다. 중요해 보이는 문자열에 전부 bp를 걸고 실행해 보았다.

123은 내가 입력한 값이다. 이 값과 AD46DFS547을 push한 뒤 함수를 call한다. esp에 더하는 것은 함수 호출 규약에 따라 스택을 정리하는 것이다.
그 다음 EAX가 0인지 아닌지 판단하여 flag를 세팅한다. 그리고 EAX의 값이 0이 아니면 분기한다.

분기되는 곳은 에러 메시지를 인자로 넣고 메시지박스를 띄우는 코드이다.
AD46DFS547이 시리얼같으니 입력해보았다.

따라서 flag는 OEP에 serial을 붙인, 00401360AD46DFS547 이다.
tags: writeup, reversing, pe file, windows, packing, upx packer, x86asm