Hacking/Reversing / / 2020. 8. 28. 16:46

Self-modifying code [자체 수정 코드]

 

이번에 리버싱을 하면서 Self-modifying이라는 새로운 신기한 기술을 하나 배웠다.

 

Self-modifying은 자체 수정 코드로써 실행 도중에 자신의 기계어 명령 코드를 주입시켜 코드를 바꾸는 걸 말한다.

 

Self-modifying은 코드영역 메모리에 W(write)권한이 있어야 동작한다.

 

w권한을 얻어오려면 바이너리 PE를 수정하는 방법, 프로그램 내에서 API를 사용해서 얻어오는 방법 등이 있다.

 

 

 

x32dbg 메모리 맵

 

 

 

 

 

긴 말 필요없이 예제를 통해 보겠다. 예제는 reversing.kr 의 replace 문제이다.

 

[그림1.] Self-modifying code

 

문제를 리버싱하다가 이러한 코드를 보았다.

 

바로 밑의 004046A9 주소를 보면 알 수 있듯이, 40466F는 함수의 주소이다. 

 

그런데 [그림 1]에서 코드는 함수 주소의 포인터 안에 어떠한 상수 값(C39000C6)을 넣고 있다.

 

그 전에 원래 함수의 내용을 찾아보자

 

[그림 2.] 바뀌기 전 0040466F (40466F) 함수의 실행 내용
[그림 3.] 바뀌기 전 0040466F (40466F) 함수의 덤프 내용

[그림 2.]의 코드와 [그럼 3.]의 덤프 HEX를 잘 기억해두자

 

[그림 3.]의 덤프 Hex를 보면 E8 06 00 00 00을 볼 수 있을 것이다.

 

이 내용이 [그림 2.]의 함수의 실행 내용을 기계어로 나타낸 것이다.

 

그럼 다시 돌아가서 [그림 1.]을 보면 함수의 주소 포인터에 C39000C6을 넣고 함수 40466F를 호출하면 어떻게 될까.

 

 

[그림 4.] Self-modifying code 실행 후 40466F의 덤프 내용

0040466F의 덤프는

 

E8 06 00 00 00 -> C6 00 90 C3 00 (C39000C6)으로 바뀌게 되었고

 

40466F함수를 호출하면 (call replace.40466F)

 

[그림 5.] Self-modifying code 실행 후 40466F의 함수 내용

함수 내용이 [그림 2.] 와 다르게 기계어 주소 C6 00 90 C3 00으로 바뀌어 있다.

 

이제 실행하면 바뀐 코드가 실행이 되는 것이다.

 

즉 프로그램이 실행 도중에 프로그램에서 기존 코드를 덮어 쓰는 코드가 있으며

그 코드로 인해 기계어 코드를 다른 코드가 덮어씌어지면서 실행의 흐름이 바뀌었다는 것이다.

 

이런식으로 Self-modifying code를 활용 할 수 있다.

 

Self-modifying code는 상용 프로그램에서는 잘 쓰이지 않지만

 

악성코드 바이러스와 이러한 대회문제 등에서 많이 사용된다고 한다. (정적분석을 엿먹이려는 것이 주 목적)

 

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유