본문 바로가기

컴퓨터와 보안/리버싱

Hello World! 리버싱3

"Hello World" 문자열 패치

 

이제 디버거를 이용해 프로그램의 내용을 패치해 볼 차례다.

HelloWorld.exe의 메시지 박스에 표시되는 "Hello World!" 문자열을 다른 문자열로 패치해 본다.

 

1. 문자열 버퍼를 직접 수정

 

우선 MessageBoxW 함수의 전달인자(410C14)의 문자열('Hello World!")버퍼를 직접 수정하는 방법이다.

PUSH OFFSET ~ 어쩌구 저쩌구로 쓰여져 있는데 더블클릭으로 쉽게 알아낼 수 있다. (아래 사진 참조)

전달인자 찾기

Reigster Window에서 [Ctrl+G] 명령어에 전달인자를 입력하면 아래 화면과 같이 Hello world! 문자열이 딱 보인다.

Reigster Window에서 전달인자 부분 찾기

이 주소부분을 마우스로 선택한 후 [Ctrl+E] 단축키로 Edit 다이얼로그를 띄운다.

Edit 다이얼로그

이제 Edit 다이얼로그의 '유니코드' 항목에 "Hello Reversing" 문자열을 입력한다.

다이얼로그 수정

(유니코드 문자열을 2바이트 크기의 NULL로 끝나야 한다.)

 

이제 main()함수로 돌아가면 MessageBoxW() 함수에 전달되는 파라미터의 내용 자체가 변경되어 있다.

실행하면

세상에 진짜 바뀌어 있다....!! 

하지만 위 방법은 원본 문자열보다 더 긴 문자열을 패치해야 한다면 뒤쪽에 있는 레지스터 값을 침범해 시스템의 안정성이 떨어질 수 있다. 이런 경우 사용할 수 있는 다른 방법이 있다.

 

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

 

이 방법은 적당한 메모리 영역에 패치하고자 하는 긴 문자열을 적어놓고 MessageBoxW() 함수에게 그 주소를 파라미터로 넘겨주는 것이다.

 

NULL padding

우선 적당한 NULL padding 영역을 찾아준다.

이곳을 문자열 버퍼로 사용해서 MessageBoxW 함수로 넘겨주면 될 것이다.

 

NULL padding 수정

NULL padding 부분을 원하는 Edit 다이얼로그를 이용해 문자열로 수정해준다.

파라미터 수정

이제 Code창에서 MessageBox() 함수에 넘겨주는 파라미터를 수정해준다.

더블클릭하면 위 창이 열리는데 이걸 수정해주면 된다.

 

이제 OllyDbg를 실행해주면

이번에도 성공하는 모습을 볼 수 있다!

 

파일로 생성하기

 

위에서 수행한 패치 작업들은 메모리에 임시적으로 한 것이라 디버거가 종료되면 패치했던 내용은 사라진다.

따라서 변경한 내용을 영구히 보존하려면 별도의 실행 파일로 저장해야 한다.

dump 창에서 변경된 내용을 선택하여 마우스 우측 버튼의 Copy to executabel file 메뉴를 선택하면, 다음과 같이 Hex창이 나타난다.

왼쪽 위가 Hex창

여기서 다시 마우스 우측 버튼의 Save file 메뉴를 선택하고 파일 이름을 Hello Reversing.exe로 저장하면 문자열이 변경된 실행파일을 볼 수 있다!

 

(다만 다른 메모리 영역에 새로운 문자열을 생성하여 전달하는 방법을 이용해 패치를 하고 파일로 만들면 제대로 동작하지 않는다.  원리를 자세히 이해하려면 PE File Format을 알아야 한다고 한다.)

저장 실패

다음 포스트는 PE File에 대해서 해보겠다.

'컴퓨터와 보안 > 리버싱' 카테고리의 다른 글

PE File Format3  (0) 2021.04.01
PE File Format  (0) 2021.03.29
Hello world! 리버싱2  (0) 2021.03.28
Hello World! 리버싱  (0) 2021.03.28
리버싱 핵심 원리  (0) 2021.03.28