인프런 커뮤니티 질문&답변

dohyun_lim님의 프로필 이미지
dohyun_lim

작성한 질문수

독하게 되새기는 C 프로그래밍

쉘 코드 (예제 포함)

ShellCodeSample03.c에 대하여 질문이 있습니다.

해결된 질문

작성

·

371

0

 안녕하세요 선생님 질문이 있습니다.

Sample03에는 WinExec , exit이 주석처리되어 있어서 선생님이 추가적으로 언급하신 함수의 주소 문제가 아닌것 같은데

'05_ShellCodeSample03.exe'(Win32): 'C:\Windows\SysWOW64\ucrtbased.dll'을(를) 로드했습니다. 
0x298c 스레드가 종료되었습니다(코드: 0 (0x0)).
예외 발생(0xFFFFFFFF, 05_ShellCodeSample03.exe): 0xC0000005: 0xFFFFFFFF 위치를 실행하는 동안 액세스 위반이 발생했습니다..

이런 에러가 떠서 기계어 숫자가 틀렸나 해서보니
밑줄에서 한 4개정도 가 달라서 수정하였더니 동작하였습니다.

#include <Windows.h>

void main()
{
	char shellcode[] = "\x55\x8B\xEC\x83\xEC\x48"
		"\xC6\x45\xF4\x63\xC6\x45\xF5\x61\xC6"
		"\x45\xF6\x6C\xC6\x45\xF7\x63\xC6\x45"
		"\xF8\x00\x6A\x01\x8D\x45\xF4\x50\xA1"
		"\x00\x70\x41\x00\xFF\xD0\x6A\x01\xA1"
		"\xC0\x70\x41\x00\xFF\xD0";
	char myshellcode[] = "\x55\x8B\xEC\x83\xEC\x48"
		"\xC6\x45\xF4\x63\xC6\x45\xF5\x61\xC6"
		"\x45\xF6\x6C\xC6\x45\xF7\x63\xC6\x45"
		"\xF8\x00\x6A\x01\x8D\x45\xF4\x50\xA1"
		"\x00\xb0\xba\x00\xFF\xD0\x6A\x01\xA1"
		"\x4C\xB1\xBA\x00\xFF\xD0";
//	WinExec("", 0);
//	exit(0);
	//int *pShell = (int*)shellcode;
	int* pShell = (int*)myshellcode;
	__asm
	{
		jmp	pShell
	}
}

해당 원인도 프로그램이 실행할때마다 ASLR 때문인것인가요? 궁금합니다

답변 1

1

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

함수 주소가 맞습니다. 다만 주석 처리한 WinExec(), exit() 함수를 한 번이라도 호출하도록 빌드해야 두 함수의 메모리 주소가 확실해집니다. 그렇지 않으면 링크되지 않아 아예 존재하지 않는 주소가 됩니다. 그리고 생각하신 것처럼 ASLR이 적용되면 주소의 위치는 계속 바뀝니다. (같은 주소가 나올 확율은 대략 1/256)

사실 좀 더 자세히 설명 할 것이 있으나 강의에서 다루지는 않았습니다. 리버싱 수업도 아니고 무엇보다 공격기법을 굳지 자세히 알릴 이유는 더욱 없기 때문입니다. 이미 알고 계시겠으나 이 예제는 공격 기법을 이해하고 대응하기 위한 취지라는 점을 잘 기억해주시면 좋겠습니다. 감사합니다.

dohyun_lim님의 프로필 이미지
dohyun_lim

작성한 질문수

질문하기