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