kaka09
code engn basic 10 본문
[사진]1-1
OEP를 언급하는것을 보아 해당 문제또한 패킹이 되어 있는 문제인것 같다. 이전 문제들과 똑같이 upx.exe를 이용하여 언팩을 시도하였으나..
[사진]1-2
upx로 패킹된 프로그램이 아니라고 한다.. 그래서 PEID 라는 툴을 사용하여 해당 문제가 어떠한 알고리즘으로 패킹 되었는지 확인하였다.
[사진]1-3
PEID로 확인결과 ASPack 이라는 알고리즘으로 패킹이 된 것을 확인할 수 있다. 나중에 따로 upx나 ASPack의 차이점 그리고 패킹 과정에 대해서도 포스팅을 다뤄야 겠다. 지금은 문제풀이에 집중 하자..
[사진]1-4
직접 올리 디버거로 디버깅 해본 결과 UPX 알고리즘 처럼 ASPack도 PUSHAD->POPAD으로 거치는 과정은 비슷했다. 다만 해당 해당 문제에서는 JMP문 대신 RETN이 존재하고 RETN 이전에 특정한 값을 스택에 PUSH 하는것을 알 수 있다. 이는 RETN이 스택에 PUSH한 00445834로 JMP 하는 의미를 갖는다. 즉 OEP=00445834 라고 할 수 있는 부분이다.
[사진]1-5
OEP로 점프 한 결과 OEP로 접근 못한건지 아니면 OEP 자체의 문제인지 한참을 헤매다 구글링을 통해 Olly dump+LordPE 를 이용해서 프로그램을 리빌드 시켜야 한다는것을 알았다. 그래서 OEP로 진입 후 Olly dump를 이용하여 다음과 같이 덤프를 시도하였다.
[사진]1-6
OEP로 진입 후 마우스 우클릭-> Dump debugged process 클릭후 [사진]1-6 처럼 덤프를 진행하여 덤프 파일을 생성한다.
[사진]1-7
위에 첨부한 압축파일을 다운 받아 LordPE.exe 실행->RebuildPE 클릭-> 프로그램 선택 하고 OK를 누르면 올리 디버거로 덤프된 프로그램이 리빌드가 완료된다. 그럼 이제부터 리빌드가 완료된 프로그램을 올리 디버거로 분석 해보자
[사진]1-8
리빌드 시킨 프로그램을 올리 디버거로 확인 해보니 정상적으로 로드 됬음을 확인 할 수 있었다. 이제부터 분석을 시도해 보자 문제에서는 "등록성공" 으로 분기하는 OPCODE를 찾으라고 했다. 그렇다면 "등록성공"과 관련된 문자열이 프로그램 어딘가에 존재 할 것이다. 따라서 올리 디버거의 문자열 찾는 기능을 이용하여 "등록성공"과 관련된 문자열을 찾아 보았다.
[사진]1-9
탐색 결과 "Registered .... well done!" 이라는 문자열이 보였다. 아마 딱 봐도 해당 문자열이 "등록성공" 키워드임을 알 수가 있다. 고로 해당 문자열을 사용하는 영역으로 이동 해보았다.
[사진]1-10
004450C 영역에서 해당 문자열을 인자로 사용하는것을 알 수 있다. 그리고 위로 좀만 올라가면 JNZ SHORT A 004452B 영역으로 분가히는 코드를 살펴볼 수 있는데 여기서 ZERO 플래그가 1 OR 0 이냐에 따라서 등록이 되는지 안되는지의 여부가 갈린다고 볼 수 있다.
'Reversing' 카테고리의 다른 글
code engn basic 12 (0) | 2017.08.02 |
---|---|
code engn basic 11 (0) | 2017.08.01 |
code engn basic 9 (0) | 2017.08.01 |
code engn basic 8 (0) | 2017.08.01 |
code engn basic 7 (0) | 2017.07.31 |