본문 바로가기

Reversing/Code_Engn(Basic)

Code Engn - Basic 19 RCE




실행시켜보면 위와같은 메세지창 하나만 뜨고 누르면 종료된다.



UPX로 패킹되어있어서 일단 언패킹 후 디버깅을 시작해보면.. 제대로 동작하지 않고 경고창이 뜬다.


API 목록을 보니 IsDebuggerPresent()를 이용하여 안티디버깅이 되어있었다. 일단 이부분을 패치하고 진행해보면..




일단 문제에서는 밀리세컨드 단위로 종료되는 시간을 구하라고 하길래, sleep함수가 사용된 부분을 먼저 찾았다.

찾다보니 아래와 같이 timeGetTime()함수가 호출되는 부분이 있었고 해당 함수를 찾아보니..



윈도우 시작 시점으로부터 시간을 재는 용도의 함수였다.


일단 해당 함수가 호출되는 부분들을 모두 찾아봤는데, 문제에서 시간의 차이를 잰다는 점을 이용하여

timeGetTime() - timeGetTime() 이런 형식으로 되어있는 부분을 찾았다.



아래 부분을 보면..


EDI에 timeGetTime()의 주소를 넣어주고, EBP에 sleep()의 주소를 넣어준다.

제일먼저 timeGetTime() 한 리턴값을 ESI에 저장해두고,

다시 timeGetTime()을 호출하며 0x444d38로 점프하게된다.( 두번째 시간값이 첫번째 시간값보다 항상크므로 항상 점프)


0x444d38로 가게되면.. 두값의 차와 [EBX+4]에 있는 값을 비교하고, [EBX+4]의 값보다 클 경우 점프

그렇지 않을 경우 sleep(10) 이후 다시 2번째 시간을 재는 부분으로 점프하며 루프를 돌게된다.




조건 분기문에서 [EBX+4]값을 확인해보면..



'Reversing > Code_Engn(Basic)' 카테고리의 다른 글

Code Engn - Basic 20 RCE  (0) 2015.06.10
Code Engn - Basic 18 RCE  (0) 2015.06.09
Code Engn - Basic 17 RCE  (0) 2015.06.09
Code Engn - Basic 16 RCE  (0) 2015.06.08
Code Engn - Basic 15 RCE  (0) 2015.06.04