#include <stdio.h>
int main(void)
{
char* pszParam = "Hello world\n";
printf(pszParam);
printf("Hello world\n");
pszParam = "nullnull != null";
printf(pszParam);
return 0;
}
위와 같은 코드가 있다.
char* pszParam에는 "Hello world\n"라는 문자열이 저장되어 있다.
char* pszParam = "Hello world\n";
printf(pszParam);
--------------------------------------------- 여기서 pszParam의 값을 수정한다면 밑에 printf는 "Hello world\n"를 출력할까?
printf("Hello world\n");
정답은 아니다.
한번 breakpoint를 걸어서 확인해보자
8번째 줄에 걸고
오른쪽 메모리를 보면 Hello world가 있다.
9번까지 실행시켜서 print문을 실행시키고, 메모리의 Hello world를 바꿔보자
"Hello world\n" -> "Hi_keiworld\n"로 메모리에서 수정했다
10번째 printf문은 과연 어떻게 출력될까?
값이 변경되었다,, 왜 일까?
char* pszParam = "Hello world\n";
printf("Hello world\n");
위 "Hello world\n" 둘 다 같은 메모리 영역을 가르키고 있기 때문이다.
C언어에서는 문자열 상수라는건 없다. 문자열 배열이다.
접근을 상수화했을 뿐, 읽기 전용으로 바꿨을 뿐이다.
그럼 어디에 존재할까??
아마 가상메모리에 존재할 것이다.
메모리 관점에서 보면, Data, Heap, Stack...등 있을 것이다.
문자열은 static 한 영역중에 Read only한 영역에 저장될 것이다.
그럼 이제 메모리 할당 시점에서 생각해보자.
Heap, stack은 Run time 시점에 할당이 되고, static 한 영역은 Complie 시점에 계산이 된다.
해당 프로그램의 .EXE을 실행하면,
위와 같이 실행될 것이다.
이제 한번, 해당 프로그램의 .EXE 파일을 HxD라는 프로그램으로 열어서 확인해보자.
이렇게 16진수로 해당 프로그램을 볼 수 있다.
이제 여기서 "Hello world"를 찾아 값을 수정하고 다시 프로그램을 실행시켜보자
값이 변경되었다...
우리는 방금 가장 간단한 해킹을 했다. 이게 바로 "리버싱"이다.