크로스레퍼런스 : 함수가 사용된 곳을 교차하여 참고할 수 있게 표시를 해주는 것

(참고 : 어떤 함수가 어디에서 또 쓰였는지를 찾기 쉽도록 표시를 해주며 Win32 API에 대해서는 심볼 함수 이름까지도 표현해준다. IDA의 가장 강력한 기능이라고도 할 수 있다)

지뢰찾기(winmine.exe)를 크로스레퍼런스 기능을 이용해 해킹해보도록 하겠다.

'C:\WINDOWS\system32\winmine.exe'를 IDA로 open한다.

(참고 : 윈도우 기본 프로그램을 open할 경우 사용할 수 있는 디버거 정보가 담겨있는 심볼 파일을 IDA가 자동으로 연결하여 자세한 정보를 표현해준다.
           설정법 : http://dakuo.tistory.com/entry/아이다IDA에-심볼-파일-연결하기)

함수 목록을 살펴본다(Functions탭)


함수 목록을 보다 보면 ShowBombs(x)라는 폭탄을 보여준다는 이름의 함수가 있다. 정확하게 어떤 함수인지 더블클릭하여 추적해보자.

이동을 해보면 우측 상단에 GameOver(x) 부분에서 이 함수가 사용되었음을 표시해준다. 그 부분에 마우스 커서를 가져다 대면 풍선 도움말 형태로 그 사용된 지점의 코드를 보여준다. 마우스 휠을 이용하면 보여지는 코드의 양을 조절할 수 있다.



따라서 어떤 메뉴를 선택했을때 ShowBombs(x)함수를 실행하게 하면 게임중 그 메뉴를 선택했을때 지뢰가 보일것이다.

1. ShowBombs(x) 함수 분석

2. 원하는 메뉴에 Call ShowBombs(x) 코드 추가


먼저 ShowBombs(x)함수를 분석해서 x 파라미터를 확인해보겠다.

.text:01002F80 ; =============== S U B R O U T I N E =================================
.text:01002F80
.text:01002F80
.text:01002F80 ; __stdcall ShowBombs(x)
.text:01002F80 _ShowBombs@4    proc near               ; CODE XREF: GameOver(x)+2Fp

GameOver(x) 부분에서 ShowBombs(x) 함수가 실행되므로 함수 목록에서 GameOver(x)를 클릭하여 GameOver(x) 함수로 이동한다.
Call ShowBombs(x) 부분에 Breakpoint 를 설정한 후 디버깅(F9)해보면


eax에 0Ah를 넣고 그 eax를 push한다. 즉 ShowBombs(x)함수에 지뢰를 보여주는 파라미터 x = 0Ah이다.

이제 원하는 메뉴에 Call ShowBombs(x) 코드를 추가하겠다.
도움말을 클릭하면 도움말 대신 지뢰가 보이게 구현을 해보겠다.

함수목록중에 help와 관련된 것을 찾아보니까 DoHelp(x, x)함수가 보인다.
DoHelp(x, x)함수가 언제 실행되는지 찾기 위해 IDA의 크로스레퍼런스 기능을 이용한다.

DoHelp(x, x)함수를 더블클릭한 후 View->Open subviews->Cross references를 선택하여
목록에 Up p MainWndProc(x,x,x,x):loc_1001F0F call    _DoHelp@8       ; DoHelp(x,x)를
더블클릭하여 이동한다.

.text:01001F0B
.text:01001F0B loc_1001F0B:                      ; CODE XREF: MainWndProc(x,x,x,x)+31Dj
.text:01001F0B                 push    0
.text:01001F0D                 push    3
.text:01001F0F
.text:01001F0F loc_1001F0F:                       ; CODE XREF: MainWndProc(x,x,x,x)+33Aj
.text:01001F0F                                         ; MainWndProc(x,x,x,x)+340j
.text:01001F0F                 call    _DoHelp@8       ; DoHelp(x,x)
.text:01001F14                 jmp     loc_10021A9     ; default
.text:01001F14                                         ; jumptable 01001F75 cases 2,5,8-15

다음에서 Call _DoHelp@8 을 Call ShowBombs(x)로 바꿔주고 파라미터도 바꿔주면 끝날것 같다.

이제 분석이 끝났으니 올리디버거를 열어 코드를 수정하도록 하겠다.
(참고 : 분석기능은 IDA가 좋지만 디버깅 기능은 올리디버거가 좋기 때문에
'IDA 분석 + 올리디버거 디버깅'  하는 조합이 좋다)



IDA로 찾아놓은 주소 번지들을 이용하여 올리디버거에서 Ctrl+G(주소이동)으로 01001F0F주소로 이동한다.


파라미터 2개 중에 어떤것이 ShowBombs(x)에 영향을 주는지 알기 위해 우선 파리미터는 놔두고 Call winmine.01003D76만 ShowBombs(x)의 주소인 01002F80로 수정한다.

도움말 F1을 누르니 3이 표현된것을 볼 수 있다.


따라서 PUSH 3을 지뢰를 보여주는 파라미터인 0Ah로 수정한다.


성공하였다 이제 save file하자.



IDA의 강력한 분석 기능과 올리디버거의 강력한 디버깅을 잘 조합해서 사용한다면 리버싱을 보다 효율적으로 잘할 수 있다.

Posted by Dakuo