악성코드 분석/실습

[윈도우즈보안과 악성코드분석기초] 문자열 패치

レ(゚∀゚;)ヘ=З=З=З 2021. 3. 22. 04:29
728x90

문자열 패치 방법

  1. 문자열 버퍼를 직접 수정
  2. 다른 메모리 영역에 새로운 문자열을 생성하여 전달

 


 

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

2주차의 'Hello World!'파일 사용해서 실습

ⓐ F8과 F7을 이용하여 main()함수에 들어가면 Text = "Hello World!" 부분을 찾을 수 있음
< breakpoint를 걸어뒀다면 [ Debug ] -> [ Run ]을 통해 바로 이동 >

ⓑ 해당 부분의 어셈블리어 코드를 더블클릭해서 확인하면 Text가 어디에 저장돼있는지 확인할 수 있음

ⓒ Hex dump에서 Text부분을 드래그 해서 [ Ctrl + E ]해서 수정
< .exe파일로 저장하려면 [ popup ] -> [ Copy to Excutable File ] >

소스 코드 없이 문자열 수정 가능하다.

더보기
※ 어셈블리어
PUSH : 메모리 상의 어떠한 버퍼에 있는 데이터를 넣어라, 삽입해라

※ 특정 주소로 이동
[ Ctrl + G ]

※ Edit data ( 수정 )
[ Ctrl + E ]

※ Hex dump에서 아스키 코드의 특징
아스키 코드 부분 확인
아스키코드는 기본으로 1byte 사용하지만 유니코드는 2byte를 사용한다. 
이 둘의 호환성을 위해 글자 사이에 '.'을 사용한다.

 

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

2주차의 'Hello World!'파일 사용해서 실습


ⓐ F8과 F7을 이용하여 main()함수에 들어감
< breakpoint를 걸어뒀다면 [ Debug ] -> [ Run ]을 통해 바로 이동 >

ⓑ NULL Padding( 비어있는 덤프 영역 ) 찾기 ( 00 00 00 00 ··· 부분)

ⓒ [ Ctrl + E ]를 통해 문자열 수정을 하는데, 아스키 코드 부분이 아닌 UNICODE 부분을 통해 수정해야함
< 문자열을 삽입한 부분의 주소를 기억해야함 >

ⓓ Text = "Hello World!" 부분에서 더블클릭하여 'PUSH [주소]' 형태에서 주소를 NULL Padding 주소로 변경
( = 어셈블리 코드를 코드창에서 수정함 ) 
< NULL Padding 주소 = 수정한 문자열에 해당하는 주소 ( 문자열이 시작하는 주소 ) >

 


 

문자열 패치 방법 실습1


[ 문자열 버퍼를 직접 수정 실습 ] 
 -> Title 문구를 "SWU.COM"으로 변경하기

[ Debug ] -> [ Run ] 을 통해 BreakPoint를 걸어뒀던 main()부분으로 이동

[ F7 ]로 main()함수 안으로 들어와 수정해야 할 Title = "www.reversecore.com" 부분의 주소가 '005B1002'인 것을 확인함

 

Title부분을 더블클릭해서 해당 Title이 저장돼 있는 주소인 5B2108을 확인함

 

Hex dump에서 [ Ctrl + G ] 를 통해 Title이 저장돼 있는 '005B2108'로 이동

 

해당 주소로 이동 후 Title에 해당하는 부분인 "www.reversecore.com"부분 드래그

 

[ Ctrl + E ] 를 통해 Title 부분을 "SWU.COM"으로 바꾸고 나머지 글자 부분들은 'HEX +00' 부분을 사용하여 NULL Padding인 '00'으로 변경

 

Title 부분이 변경된 것을 확인

 

Title 부분이 변경된 것을 확인

 

실행을 시켜 메세지 박스가 나오도록 하면 Title 부분이 변경한 문구인 "SWU.COM"으로 나오는 것을 확인

 

 

 

문자열 패치 방법 실습2

[ 다른 메모리 영역에 새로운 문자열을 생성하여 전달 실습 ] 
 -> Title 문구를 "SWU.COM"으로 변경하기

[ Debug ] -> [ Run ] ( = [ F9 ] )을 통해 BreakPoint를 걸어뒀던 main()부분으로 이동

 

[ F7 ]로 main()함수 안으로 들어와 수정해야 할 Title = "www.reversecore.com" 부분의 주소가 '00502108'인 것을 확인함

변경해야 할 Title = "www.reverscore.com" 부분으로 [ Ctrl + G ]를 통해 이동

 

Title 근처 ( '00F81002' ) NULL Padding 영역과 주소인 '005021A8'을 확인

 

[ Ctrl + E ] 를 통해 Edit data로 들어간 다음 아스키 코드 부분에 "SWU.COM" 삽입 



더보기

※ UNICODE가 아닌 아스키 코드를 수정한 이유

원래 2Byte 기준으로 하기 때문에 HEX부분이 '53 00 57 00 55 00 2E 00 43 00 4F 00 4D 00' 로 구성이 되어야하는데, 컴파일러에 따라 다르다.

기존 HEX 코드를 확인했을 때 문자열 부분이 1Byte기준으로 이뤄져 있다면 컴파일러 기본이 UNICODE로 돼있는 것이 아니라 아스키 코드로 돼있는 것이다.

UNICODE를 사용하여 변경을 하게 되면 '53 00 57 00 55 00 2E 00 43 00 4F 00 4D 00' 처럼 값이 들어가게 되는데, 아스키 코드는 NULL이 나오면 문자열이 끝난다는 것으로 인식하기 때문에 한 글자만 출력된다.

그렇기 때문에 UNICODE를 사용하지 않고 아스키 코드를 사용하여 수정한다.

2Byte 기준으로 하는 이유 : 언어 호환성 때문

 

Null Padding 부분이 "SWU.COM"으로 변경된 것과 그 주소가 '005021A8'인 것을 확인

 

Title 부분 메시지를 PUSH해주는 어셈블리 코드창에서 변경된 주소로 변경

 

주소를 변경하니 Title = "www.reversecore.com" 대신 아스키 코드 "SWU.COM"으로 변경된 것을 확인



실행을 시켜 메세지 박스가 나오도록 하면 Title 부분이 변경한 문구인 "SWU.COM"으로 나오는 것을 확인