Security&Hacking/리버싱

Lena Reversing - tutorial 14

Dior2ky 2020. 3. 7. 16:59
반응형

Lena Reversing tutorial 14

이번 튜토리얼의 목적은 인라인패치를 하는 것이다. 

프로그램을 실행 해 보면 다음과 같이 나온다. 

Enter Reg.Code 를 눌러주면 다음과 같이 register 하는 창이 뜬다. 

아무 값이나 넣어서 Ok 버튼을 누르면 다음과 같이 오류 창이 뜬다. 

Ollydbg로 프로그램을 열어준다. 

Control + n을 눌러 module 목록을 열어준다.

프로그램이 30일 제약이 걸려있기 때문에 시간과 관련된 API를 사용할 것으로 추정된다. 

KillTimer API를 찾는다.

set breakpoint on every reference를 눌러서 breakpoint를 걸어준다.

48개의 breakpoint가 걸린다. 

실행시키면 break가 계속 걸리지만 프로그램이 실행 될때까지 진행시킨다. 

프로그램이 실행되면 Enter Reg.Code를 눌러 아무 값이나 넣고 Ok 버튼을 누른다.

임의로 name은 abcde, serial number는 1234567890, code는 6789012345를 넣어주었다.

break가 걸리면 아래 코드를 살펴본다.

아래쪽으로 등록에 성공했을때와 실패했을때의 문구로 보이는 값들이 보인다. 

EAX와 4를 비교하여 같으면 성공했을때의 값으로 가는 것으로 보인다.

그 위쪽을 살펴보면 비교문과 분기문이 보인다.

비교문은 어딘가로부터 분기해서 들어오고 있다.

어디서 왔는지 따라가준다. 해당 라인을 누르면 가운데에 어디서 왔는지 나온다.

004DC04C에서 왔고 역시 EAX와 값을 비교해서 분기하고 있다.

이번에도 비교 전에 분기해서 오고 있는데 또 따라가준다. 

이번엔 004DBE01에서 왔다. 이번에도 EAX와 값을 비교하여 분기하고 있다. 

비교 전에 분기해서 오고 있으므로 또 따라가준다. 

004DBDA9에서 오고 있고 살펴보면 역시 EAX와 값을 비교하고 있다.

이번엔 좀 다르게 분기해서 들어오지 않고 EAX의 값이 정해지는 부분이 보인다.

004DBD9E에 breakpoint를 걸어준다.

여기서 EAX의 값이 4로 설정되어야 성공적으로 출력되게 된다. 

다시 값을 넣고 Ok 버튼을 눌러준다. 

break가 걸린 후 값을 살펴보면 3이 들어있는 것을 확인 할 수 있다. 

이 값을 변경해주면 되는데 여기서 현재 3byte의 값으로 표현하고 있지만 MOV EAX, 4를 하는 순간 5byte의 값이 필요하게 된다.

그렇게 되면 주소값이 완전히 바뀌기 때문에 이렇게 할 수가 없다.

여기서 사용하는 것이 인라인 패치이다. 

여기서 JMP를 해주어야 하는데 long jmp를 하게되면 역시 5byte가 필요하다.

따라서 PUSH EBX와 PUSH ESI의 영역까지 필요하게 된다. 

이 값들을 기억했다가 JMP한 위치에서 써주도록 한다.

이제 JMP할 잉여 공간을 찾는다.

쭉 내려주면 005E47C0 부터 쭉 비어있는 것이 보인다.

혹시 모르기 때문에 좀더 여유를 가지고 뒤쪽의 값을 활용한다. 

EAX의 값을 4로 변경하고 이전에 JMP 문으로 바꾸면 PUSH EBX와 PUSH ESI 영역까지 덮어지기 때문에 이 내용도 추가해준다.

다음은 다시 원래로 돌아가도록 JMP문을 써준다. 

다시 원래의 코드로 돌아가서 JMP 5E4800으로 바꾸어준다. 

 

KillTimer의 breakpoint를 모두 해제해주고 실행한다. 

그러나 등록이 되지 않고 계속해서 검증 루틴이 돌아가게 된다. 판단을 잘못 한 것으로 보인다. 

이전에 EAX를 비교하며 나가는 과정에서 끝까지 가게 되면 EAX와 B의 값을 비교하고 있는것을 볼 수 있다. 

4가 아닌 B로 바꾸어주도록 한다. 

다음과 같이 성공적인 메세지가 출력되는 것을 볼 수 있다.

4인경우 등록을 완료 하고 0B인경우 메세지를 출력하는 것으로 보인다. 

끝.

반응형