이번에 리버싱을 하면서 Self-modifying이라는 새로운 신기한 기술을 하나 배웠다.
Self-modifying은 자체 수정 코드로써 실행 도중에 자신의 기계어 명령 코드를 주입시켜 코드를 바꾸는 걸 말한다.
Self-modifying은 코드영역 메모리에 W(write)권한이 있어야 동작한다.
w권한을 얻어오려면 바이너리 PE를 수정하는 방법, 프로그램 내에서 API를 사용해서 얻어오는 방법 등이 있다.
긴 말 필요없이 예제를 통해 보겠다. 예제는 reversing.kr 의 replace 문제이다.
문제를 리버싱하다가 이러한 코드를 보았다.
바로 밑의 004046A9 주소를 보면 알 수 있듯이, 40466F는 함수의 주소이다.
그런데 [그림 1]에서 코드는 함수 주소의 포인터 안에 어떠한 상수 값(C39000C6)을 넣고 있다.
그 전에 원래 함수의 내용을 찾아보자
[그림 2.]의 코드와 [그럼 3.]의 덤프 HEX를 잘 기억해두자
[그림 3.]의 덤프 Hex를 보면 E8 06 00 00 00을 볼 수 있을 것이다.
이 내용이 [그림 2.]의 함수의 실행 내용을 기계어로 나타낸 것이다.
그럼 다시 돌아가서 [그림 1.]을 보면 함수의 주소 포인터에 C39000C6을 넣고 함수 40466F를 호출하면 어떻게 될까.
0040466F의 덤프는
E8 06 00 00 00 -> C6 00 90 C3 00 (C39000C6)으로 바뀌게 되었고
40466F함수를 호출하면 (call replace.40466F)
함수 내용이 [그림 2.] 와 다르게 기계어 주소 C6 00 90 C3 00으로 바뀌어 있다.
이제 실행하면 바뀐 코드가 실행이 되는 것이다.
즉 프로그램이 실행 도중에 프로그램에서 기존 코드를 덮어 쓰는 코드가 있으며
그 코드로 인해 기계어 코드를 다른 코드가 덮어씌어지면서 실행의 흐름이 바뀌었다는 것이다.
이런식으로 Self-modifying code를 활용 할 수 있다.
Self-modifying code는 상용 프로그램에서는 잘 쓰이지 않지만
악성코드 바이러스와 이러한 대회문제 등에서 많이 사용된다고 한다. (정적분석을 엿먹이려는 것이 주 목적)
'Hacking > Reversing' 카테고리의 다른 글
Abex's Crackme #5 분석 (0) | 2019.12.02 |
---|---|
PE File Format - (1) (0) | 2016.09.26 |
[리버싱] 함수의 에필로그, 함수 호출 규약 (0) | 2016.05.11 |
[리버싱] Visual Basic 파일 특징 (1) | 2016.05.04 |
[리버싱] IA-32 레지스터의 종류 (기초) (0) | 2016.04.28 |