반응형
반응형

 

Write-up 쓴 날짜 : 2022-10-26 19:21

 

ReverseMe. NAGs.exe
0.29MB
patched_ReverseMe. NAGs.exe
0.29MB
NonaWrite.zip
0.07MB

 

목표 - How to study behaviour in the code, continued inlining using a pointer

 

ollydbg nonawrite plugin :  http://www.openrce.org/downloads/details/217/NonaWrite

Bookmark plugin : 

BOOKMARK.DLL
0.05MB


분석 1

 

 

이 프로그램은 Visual C++로 작성되어 있다.

 

 

프로그램을 실행하면 맨 처음에 위와 같은 Nag 창이 뜨고

 

 

Regiter 버튼을 누르면, 등록이 되고, 프로그램 종료시 나타나는 Nag 창이 나타나지 않는다.

 

code에서 두 Nag 창들을 제거해라 라는 메세지 창이 뜬다.

 

 

프로그램을 종료하면 위의 Nag 창이 몇 초 떠 있다가 종료한다.

 


분석 2 및 풀이

 

 

Ollydbg에 프로그램을 올린 후 F9 키를 눌러 실행하면 위와 같이 첫 번째 Nag 창이 뜬다.

 

 

첫 번째 Nags 창이 뜬 상태에서 Ollydbg에서 F12 키를 눌러 일시정지를하면 위와 같이 멈춘다.

 

이 상태에서 Call Stack을 봐본다.

 

 

콜 스택은 위와 같고, 42039A 주소에서 Nag 창을 호출하는 것 같다.

 

그리고 MFC42.2514에서 Nag 창을 생성하는 것 같다.

 

42039A 주소로 가본다.

 

 

42039A 주소로 간 후 스크롤을 조금 위로 올려보면 420379 주소에 JE 명령이 있다.

 

이 JE 명령이 수행되면 4203BA 주소로 점프하고 수행되지 않으면 42039A 주소로 가는 것이다.

 

420379 주소에 BP를 걸고 Ctrl + F2 키를 눌러 재실행 후 F9 키를 눌러 실행한다.

 

 

그러면 BP가 걸린 420379 주소에서 멈추게 된다.

 

 

F8 키를 눌러 한 줄씩 진행하다가 42039A 주소에서 어떠한 함수를 호출하면 위와 같이 첫 번째 Nag 창이 뜬다.

 

 

그리고 42039A 주소에서 호출하는 함수가 끝나면서 첫 번째 Nags 창도 꺼지게 된다.

 

 

F9 키를 눌러 실행하면 위와 같이 한 번 더 420379 주소의 JE 명령에서 멈추게 된다.

 

 

F8 키를 눌러 한 줄씩 진행하다보면 42039A 주소에서 호출하는 함수가 호출되는데 위와 같이 Register 버튼이 있는 창이 뜬다.

 

 

Exit 버튼을 누르면 위와 같이 42039F 주소로 오게 된다.

 

 

F9 키를 눌러 실행하면 위와 같이 또 420379 주소에서 멈추게 된다.

 

 

그리고 F8 키를 눌러 한 줄씩 진행하다보면 위와 같이 42039A 주소에서 호출하는 함수에 의해 2번째 Nag 창이 뜬다.

 

 

Ctrl + F2 키를 눌러 재실행 한 후 F9 키를 눌러 BP를 걸어둔 420379 주소까지 진행한다.

 

420379 주소에서 조건 분기가 수행되어야 Nag 창이 안 뜨는데, 그렇게 하면 Register 버튼이 있는 메인 창도 안 뜨게 된다.

 

즉, 첫 번째 실행 시에는 분기가 되고, 두 번째는 분기가 되지 않아야 하며 세 번째에도 분기가 되어야 한다.

 

JE 조건문을 만날 때마다 특정 조건을 비교할만한 변수 하나를 만들고 조건 분기를 지정할 코드를 인젝션한다.

 

이제 Inline patch를 하기 위해 데이터 섹션에 빈 공간이 있는지 확인한다/

 

 

ollydbg의 상단에 있는 애메랄들 아이콘들 중 M 버튼을 눌러 memory를 보면 위와 같이 ReverseMe 파일의 메모리 영역이 보이는데 이 중 .data 영역을 더블 클릭하여 이동한다.

 

 

스크롤을 쭉 내려서 .data 영역의 끝으로 이동해보면 445E70 주소에서부터 NULL 값으로 되어 있다.

 

안전하게 445E80 주소에 있는 값을 변수로 사용할 것이다.

 

현재 0으로 되어 있으므로 JE 조건문이 실행될 때마다 1씩 증가시키도록 한다.

 

 

 

 

다시 어셈블리어로 돌아와서 이제 Code Cave를 설치할 공간을 찾아야 한다.

 

스크롤을 쭉 내리면 위와 같이 437D62 주소부터는 0으로 채워져 있다.

 

 

 

420379 주소의 JE 명령에서 JMP 437D62 이라고 수정하면

 

JE 명령어는 2byte를 차지하는데, 인라인 패치를 진행할 주소인 437D62 주소는 420379 주소로부터 80byte가 넘기 때문에 Long 점프를 해야 하는데, Long 점프는 5byte를 차지하고, 그러면 42037B 주소의 명령어 부분까지 덮어쓰게 된다.

 

덮어씌워지는 명령을 복사해놓고, 덮어쓴 뒤 남은 부분은 NOP으로 채운다.

 

 

NonaWrite 플러그인을 이용해 위와 같이 어셈블리어를 입력하고 Assemble을 누른다.

 

NonaWrite 플러그인을 굳이 이용해야 하는 건 아니지만, 그냥 0x437D62 주소부터 한줄 한 줄 입력하기 귀찮아서이다.

 

NonaWrite에 적은 내용과 해석은 아래와 같다.

 

0x437D62:
inc byte ptr[445E80]
cmp byte ptr[445E80], 2
jnz 4203BA
lea ecx, dword ptr ss:[esp+4c]
jmp 42037F
// 명령어가 작성될 주소
// 주소 끝에 있는 콜론은 필수적이다.
0x437D62:

// 비교할 변수로 사용하기 위해 이전에 찾았던 .data 영역의 마지막 부분에 있는 주소
// 처음 실행되면 1로 증가될 것이다.
inc byte ptr[445E80]

// 비교할 변수의 값과 2와 비교한다.
// 2와 비교하는 이유는 1이면 1번 째 Nag 창이고, 2이면 main 창이기 때문이다.
cmp byte ptr[445E80], 2

// 4203BA 주소는 원래 JE 명령어에서 점프하려고 한 주소이다.
// 맨 처음에는 1과 2를 비교하므로 ZF = 0이고, ZF = 0이므로 4203BA 주소로 점프하여 Nag 창이 안 뜬다.
jnz 4203BA

// 원래 JE 명령어 다음 라인에 있던 명령
lea ecx, dword ptr ss:[esp+4c]

// 맨 처음 위의 조건문이 실행되면 Nag 창 생성 코드가 실행되지 않지만
// 두 번째 실행시에는 main 창을 생성하는 코드를 실행시켜줘야 하므로 조건문 다음 명령어 주소로 분기시켜준다.
jmp 42037F

 

 

그러면 위와 같이 437D62 주소에 명령어가 쓰인다.

 

그리고 패치된 내용을 저장한다.

(디스어셈블리 창 -> 우클릭 -> copy to executable -> All modifications -> Copy all -> 우클릭 -> Save File)

 

 

그리고 패치된 파일을 실행하면 첫 번째와 3번째 Nag 창은 없어지고 main 창만 뜨게 된다.

 

 

 

반응형

'전쟁 > lena tuts4you' 카테고리의 다른 글

[Lenatuts4you] 17. KeygenMe  (0) 2022.11.02
[Lenatuts4you] 16. Urlegal, movgear  (0) 2022.11.02
[Lenatuts4you] 14. DVDMenuStudio  (0) 2022.11.02
[Lenatuts4you] 13. XoftSpy  (0) 2022.11.02
[Lenatuts4you] 12. Teksched  (0) 2022.11.02

+ Recent posts