디미고에 와서 시작하는 두번째 프로젝트.
개인 홈페이지에서 관리를 하려고 1학기때 시도했는데, 서버 자체도 불안정하고 죄다 날아가버려서 티스토리에서 연구 버전 관리를 하기로 했다.
연구라고 거창하게 이름 붙일 것도 없이 문제 풀이를 하면서 그 구조를 이해해 나가는 것을 중점적으로 하려고 한다.
우선 CodeEngn_Advanced 문제부터 풀고 그 후에 Reversing.kr 문제를 다루어 보도록 할 것이다.
CodeEngn Advance 01
문제 내용: 이 프로그램은 몇 밀리세컨드 후에 종료 되는가
간단하게 peid로 프로그램을 봤는데 upx로 패킹이 되어 있다.
upx언패커로 간단하게 패킹을 풀어 주자.
그리고 디버거에 키니까 안티 디버거가 작동한다. 약간의 패치를 해 주기로 했다.
디버거를 찾는 영역인 IsDebuggerPresent함수를 그냥 MOV EAX, 0로 패치해 주었다.
그 다음 조금 더 생각을 해 보니까 현재 시간을 가져오는 함수를 써야 시간을 비교할 수 있을것 같았다.
timeGetTime이라는 함수가 보이길래 BP를 걸고 분석을 시작했다.
timeGetTime으로 현재 시간을 불러오고 나중에 한 번더, timeGetTime을 실행해 시간의 차이를 구한다.
위의 코드를 해석했다면, 알 수 있지만 나중에 가져온 time값이 esi, 처음 가져온 time값이 eax에 박혀 있다.
그렇다면 사진에 올려둔 결정적인 분기점에서 eax에서 esi를 뺀 값과, ebx+4에 위치한 값을 비교하게 되고, 더 분석을 해 보면 EAX>=ESI라면 메시지박스가 실행되고 프로그램이 꺼지게 되며, 그게 아니라면 Sleep동작을 실행해 시간 값을 맞춰 주는 루틴을 수행한다.
그래서 결국 정답은 ebx+4위치에 있는 값이 프로그램이 동작하는 시간이다.
'저세상 해킹 > 역공학' 카테고리의 다른 글
2 - Code Engn Advanced (0) | 2019.09.03 |
---|