-
Windows Shellcode 에러Hack/Windows 2016. 5. 27. 01:01
shellcode 를 만드는법에 대해서 알아보았는데 강의를 보아선 정말 간단했다.
리눅스는 쉘코드를 직접만들지않고 다른사람의것을 가져와도 되지만 윈도우즈는 조금 틀렸다.
윈도우즈는 각자의 환경에따라 kernel32.dll이 바이너리에 맵핑될때 주소가 다르고, ImageBase 값도 다르며 각 함수의 오프셋도 다르기때문에 직접 작성해주어야한다.
-------
쉘코드 만드는법에 대해서는 다른 강의가많으니 구지 설명을 따로 할 필요없이, 함수의 offset 과 kernel32.dll의 ImageBase대로 똑같이 계산했는데 쉘코드가 정상작동하지않아 화가날때 참고하라는 글입니다!
우선 모두가 하는일이 아래와같은 코드를 짜서 Disassembly한 결과로 테스트를 해볼거에요 아마
#include <Windows.h>
int main() { char buf[5]; buf[0] = 'c'; buf[1] = 'a'; buf[2] = 'l';
buf[3] = 'c'; buf[4] = '\0'; WinExec(buf,SW_SHOWNORMAL); exit(1); }
WinExec(실행시킬프로세스명, 실행특징); 으로 구현이되는데, 코드는 설명이 필요없을거같네요..
일단 쉘코드 강의를보면 kernel32.dll에 exit(1);와 WinExec 함수가 포함되어있는데 그래서 kernel32.dll ImageBase + Function Offset 을 하는거에요
근데 이렇게했는데 쉘코드가 정상작동을안해... 막 크래쉬가 난다! 그럼 스크롤 쭊쭉 더 하시면되요
저같은경우는 아래와같이 해결했어요. 우선 저 프로그램을 작성해서 올리디버거로 열어줘요
그럼 이렇게 다양한 인스트럭션이있을거아니에요? EBP-8~-4 까지 calc\0 이라는 문자열을 집어넣어주고 문자열이 들어간 주소를 구해서 WinExec의 첫번째 인자로넣어서 실행을 시켜주는 코드에요 당연하다고 생각하실 분들도있지만 전 이생각을 늦게해서 하루동안 삽질했네요 ㅎㅎ..
일단 WinExec의 IAT를 확인하면되요 그냥 ExitProcess 도 알아주구요
call eax 를 하기전에 레지스터 상황이에요 kernel32.WinExec 의 주소인데 그냥 쉽게 이렇게 구해줄수있어요
그리고 코드를 작성하면되죠
#include <windows.h> void main(){ __asm{ push ebp mov ebp,esp sub esp,48h mov byte ptr [ebp-8],63h mov byte ptr [ebp-7],61h mov byte ptr [ebp-6],6Ch mov byte ptr [ebp-5],63h mov byte ptr [ebp-4],0 push 1 lea eax,[ebp-8] push eax mov eax,0x761431F9 call eax push 1 push eax mov eax,0x760c79d8 call eax } }
이렇게 작성해주고 옵코드 따와서 실행시켜주면 정상적으로 실행되는것을 확인할수있어요
반갑죠 이 계산기..
그리고 가끔 64비트를 사용하시는분들, ExitProcess 가 ntdll에 속해있을때가있는데 당황하지마시고 재부팅한번 해보세요
저도 재부팅한번해봤는데 맵핑이 갑자기 kernel32.dll로 되더라구요...
뭐 그래도 안된다하시면 그냥 ntdll 오프셋으로 하시면되겠죠 어느 바이너리든 해당 dll들은 임포트되니까 상관없어요
그럼 삽질 그만하시길!
'Hack > Windows' 카테고리의 다른 글
SEH(Structured Exception Handling) (0) 2016.06.01 Windows BOF (ASLR) (0) 2016.06.01 Windows Calc Shellcode (0) 2016.06.01 Windows BOF Exploit with Shellcode (0) 2016.05.27 Windows BOF (0) 2016.05.24