반응형




안녕들 하시죠 !


지금까지 리버싱을 배우기 위한 준비를 했다면 본격적으로 공부를 해볼까 합니다.

 

우선, 오늘은 문자열 패치에 관한 내용입니다.

 


패치란?


기존 응용 프로그램의 버그를 수정하거나 또는 새로운 기능을 추가시킬수 있다.

패치 대상은 파일 혹은 메모리가 될 수 있으며, 프로그램의 코드와 데이터 모두 패치가 가능하다.


 

저번시간에 저희는 Main() 함수를 찾았고, 그 안에있는 “Hello World !” 문자열을 찾았습니다.


이제 “Hello World !” 문자열을 다른 문자열로 변경시키는 패치 작업을 해보겠습니다.

 

Ollydbg를 실행시켜주시구요, Main() 함수 시작주소까지 가보겠습니다.



다들 잘 이동하셨죠?

 

, 그럼 이제 Main() 함수 시작주소 ( 401000 ) F2Break Point를 설정하고 F9를 눌러 실행하겠습니다.

 

문자열을 패치하는 방법은 두가지가 있습니다.


첫번째, 문자열 버퍼를 직접 수정.


두번째, 다른 메모리 영역에 새로운 문자열을 생성하여 전달.


가장 쉬운 부분이라고 하니 우선 확실히 익히고 넘어가야 할 것 같습니다.

 

문자열 버퍼를 직접 수정하는 방법인데요

아래 이미지에 빨간 화살표로 보이는 부분 덤프창 )을 클릭한 후에 Go to (Ctrl + G) 명령으로 “Hello World !”의 함수 전달인자 주소로 갑니다.

“Hello World !” 의 함수 전달인자 주소가 밑에 이미지 처럼 ??_C@_1BK@EKFA.... 으로 되어있으실 경우 더블클릭하면 해당하는 주소가 나옵니다.



OK를 누르게 되면 아래와 같은 이미지가 나오게 됩니다.



“Hello World !” 부분을 마우스로 드래그하신 후에 맨 왼쪽 주소부분을 보시게 되면,

우리의 문자열은 411AF0 ~ 411B00 부분을 차지하고 있습니다.

 

Ctrl + E (Edit 다이얼로그) 를 띄워봅시다.



저는 이미 수정을 했는데요. 주황색 포인트 부분을 보시면 될것같습니다.


우선 왼쪽 하단 Keep size 부분의 체크를 해제시켜주시구요, UNICODE 부분의 “Hello World !” Hello Reversing으로 바꿔줍니다.

 

이때 주의 할점은 유니 코드 문자열은 2바이트 크기의 NULL로 끝나야 한다는 것입니다.

원본인 “Hello World !” 보다 “Hello Reversing” 문자열의 길이가 더 길고, 원본 문자열 뒤쪽에 어떤 데이터가 존재할 수 있기 때문에 원본 길이를 넘는 

문자열로 덮어쓰는 것은 위험하여 주의하여하 할 것 같습니다.

 

이제 위에있는 코드창으로 가서 F9를 눌러 실행시켜봅시다.



, 우리가 원하는 대로 문자열 패치를 성공시켰습니다 .

하나하나 따라서 해보니 너무 재미있어서 시간가는줄 모르겠습니다.

 

이제 우리가 패치한 파일을 저장하는 단계만 남았습니다.


아래 dump창에서 변경된 내용 ( “Hello Reversing” ) 문자열을 블록 잡고 우측 클릭하여 Copy to executable file 메뉴를 선택하면 Hex창이 나옵니다. 

여기서 다시 마우스 우측 버튼의 Save file 메뉴를 선택하고 이름을 원하는대로 바꾸어주면 저장이됩니다.

다시 실행하여 문자열 값이 잘 변경되어있는지 확인해주시면 됩니다.



다음시간에는 문자열 패치 두번째 방법 다른 메모리 영역에 새로운 문자열을 생성하여 전달부분을 진행해보겠습니다. 


오늘은 여기까지입니다 감사합니다 !




참고서적 이승원 「리버싱 핵심원리」 인사이트(2018) p37~41

+ Recent posts