리버싱을 시작하는 초심자를 위한 레나 리버싱 튜토리얼

(다운로드  : https://tuts4you.com/download.php?list.1)



<level 1>



레벨1의 reverseMe.exe를 실행하면 이러한 nag창이 뜬다.

메세지를 보고 라이센스를 우회하는 문제임을 유추할 수 있다.




레벨 1의 reverseMe.exe를 올리디버거로 실행했을 때의 첫 화면이다.


코드 좌측 하단을 보면 "Keyfile.dat"및 "createFile" 문자열이 보인다.

우선 그 부분까지 F8(Step Over)로 내려가본다.




CreateFile을 지나고 JNZ 분기문이 나온다.

JNZ은 0이 아닐 때 점프하는 명령어로 ZF가 0일 때 점프한다.

*ZF(Zero Flag)는 결과값이 0일때 1(set), 0이 아닐 때 0(unset)이다

JNZ으로 점프하지 않으면 바로 메세지가 뜨고 프로세스가 종료함을 알 수 있다.



따라서 화면 우측 상단의 레지스터 창에서 ZF(현재 화면에서 약간 잘렸지만 회색으로 토글되어있는 부분)를

클릭해 0으로 수정하면 JNZ 점프문이 빨간 화살표로 활성화된 것을 알 수 있다.



계속해서 F8로 넘어가다 보면 새로운 JNZ 분기문이 등장한다.




여기서 JNZ으로 점프하지 않으면 바로 아래의 JMP문을 통해 무조건적으로 프로세스 종료문으로 넘어가게 된다.




따라서 아까와 같은 방식으로 ZF를 수정해 JNZ문으로 점프해 넘어간다.




조금 더 내려가면 JL문의 조건에 충족하면 아까와 같이

프로세스 종료문(4010F7)로 점프하는 것을 알 수 있다.




결과값이 0일 경우, 아닌 경우 ZF에 영향을 받지만

결과 값이 음수가 나오는 경우 SF(sign flag)가 1(set)이 되며 음수가 아닌 경우 0(unset)이 된다

따라서  JL(jump is less)문은 SF가 set되어 있을때 (비교한 두 값의 결과가 음수일 때) 점프를 하게 된다.

분기문을 피해가기 위해 SF를 0으로 수정한다.




JL문 바로 아래의 JMP으로 점프하면 우회 성공이며 축하 메세지 창이 뜬다.

기본적인 바이너리 패치를 통해 문제를 해결하였다.



+ Recent posts