본문 바로가기

모의해킹/리버싱

올리디버거를 사용한 인라인 패치 : 레나 챌린지 (Level 14)

728x90

• 인라인 패치 : 실행이 자연스럽게 이어지도록 만드는 것

기간이 만료되어 프로그램을 실행시킬 수 없다..

오늘은 인라인패치로 라이센스를 우회할 예정이다.

레지스터를 임의의 값을 입력을 하면 등록 실패 메시지가 출력이 된다..

 

Call Stack에서 메시지 박스를 호출하는 위치를 확인한다.

 

메시지 박스를 호출하는 곳으로 가서 브레이크포인트를 걸어준 다음 실행을 시켜보자.

실행시키다 보면 레지스터 길이, 빈 공간에 따라 다른 메시지가 나오지만, 호출되는 곳은 똑같다.. 즉, 함수로 감싸져서 계속 재사용된다는 사실을 알 수가 있다.

 

메시지 박스 출력호출하는 앞부분에 브레이크 포인트를 걸어서 분석을 해보자.

esp 따라가서 이 함수 자체가 어디선가 계속 호출된다는걸 아니까 find references를 통해서 확인해 보자.

 

이곳이 메시지 박스를 띄어주는 곳이다.

그래서 set break every command를 다 해주시면 정작 필요한 메시지 부분에서 브레이크가 걸릴 거이다.

 

레지스터 등록을 시도를 하면 004 DC1 B6 부분에서 브레이크 포인트가 걸린다.

메시지 박스를 읽어 보니 브레이크 포인트가 걸린 부분 밑에 우리가 가야 할 곳이 있다..(성공 메시지~)

분기점을 찾아보자.

 

위쪽 부분에 분기점에 브레이크 포인트를 걸어 다시 실행을 시켜준다.

JNZ을 JMP로 수정을 해준다.

 

두 번째 분기점에서는 그냥 NOP으로 변경을 해준다.

 

분기점이 통과가 되면서 레지스터가 등록이 되었다는 메시지가 출력이 된다.

파일을 저장을 한다.

저장한 파일을 실행시키면 등록이 정상적으로 안되어있다...

레지스터 등록은 안되고 다시 등록을 하면 정상적으로 등록되었다는 메시지만 출력이 된다....

 

다시 돌아와서 보면 EAX가 3 또는 4에 따라 실행되는 게 다르다,, 거꾸로 올라가보면 EAX에 따라 실행되는게 달라지는 거 같다.

 

해당 부분에서 EAX가 세팅되는 위치이다.

해당 주소를 Mov EAX, 1로 수정을 문제가 생긴다...(EAX, 1 또는 2 또느 3 등 이건 노동으로 해야지 1이 정상인지 알 수 있다)

용량을 보면 8 B45 = 4byte, 08 = 2byte 총 6byte 이기 때문에 1(8byte)을 넣으면 오버플로우가 일어난다.

 

인라인 패치를 위해 몇 개의 명령어를 복사해 놓는다..!

Mov 부분을 JMP 11111111로 수정을 하면 ESI까지 덮어 쓰인다... 

 

Ctrl + B을 눌러 00을 여러 개 입력을 해주면 빈 공간으로 이동이 된다.

빈 공간을 Mov eax, 1을 작성하고 덮어 쓰인 값들을 적어준다.

그다음 JMP EDI가 있던 주소로 이동을 해준다.

 

JMP 11111111로 되어있던걸 JMP 빈 공간에 작성한 주소로 수정을 해주고 파일을 저장을 한다..

 

프로그램을 실행시키면 정상적으로 라이선스가 등록이 되면서 작동이 잘 된다.~!