본문 바로가기

모의해킹/리버싱

인라인 패치를 할 때 고려해야 하는 것들 : 레나 챌린지(Level 15)

728x90

 

오늘 문제는 nag를 없애는 문제이다.

프로그램 실행 시작 전, 종료할 때 nag가 출력이 된다.

 

nag가 실행이 될 때, 일시정지를 눌러준다.

Call Stack에 가서 하나씩 분석해 보자.

 

<JMP.&MFC부터 들어가 브레이크 포인트를 걸어주고 재실행을 해보자.

해당 부분에서 브레이크가 걸리는 거 보면 여기 부분에서 호출을 하는 거 같다. 

 

콜이 돼서 온 것 같으니까 ESP를 확인하면 호출된 주소로 갈수있다.

 

분기점을 찾아서 평소 하던 대로 JE를 JNZ로 수정을 하고 실행을 시키면 프로그램이 종료가 돼버린다.

 

인라인 패치를 하기 위해 JE를 JMP로 수정을 해 여하는데 공간이 작아서 수정을 하기가 애매하다.

그렇기 때문에 CALL <JMP 부분의 공간을 사용할 것이다.

 

빈 공간을 찾아 이동을 한다. 여기에서는 쓰기 권한이 없기 때문에 사용을 못 한다. 그렇기 때문에 쓰기 권한이 있는 곳으로 이동하는 프로그래밍을 해줘야 한다.

 

메모리에 들어가서 쓰기 권한이 있는. data 부분의 빈 공간에다가 인라인 패치를 할 것이다.(올리디버그 툴이 이상하게 쓰기 권한 표시가 안 보인다.... 다른 툴은 보임..)

 

 00446 FF0 공간을 사용할 것이다.

 

CALL 00432 D3 E

push eax  -> EAX를 사용해서 인라인 패치를 할 때는 함부로 데이터를 갖다 쓰면 안 되기 때문에 EAX를 고정시킨다

mov eax, [446 FF0]   -> eax로 가져온다.

inc eax  -> eax를 1을 올려준다.

mov [446 FF0], eax   -> [446FF0] 주소에다가 eax를 저장한다.

cmp eax, 2

pop eax   -> 다 쓰고 나서 다시 복구를 해줘야 한다. 

je 42037b  -> eax가 2면 windows가 실행이 된다.

jmp 004204 BA  -> windows가 실행이 안된다 nag가 실행 안된다

 

새로 작성한 주소로 jmp 437 D65를 해준다. 

그다음 나머지는 Nop으로 채워주고 파일을 저장하면 정상적으로 첫 번째 nag와 세 번째 nag가 실행이 안된다.