본문 바로가기
System

쉘코드 작성(cmd호출, Poc형식)

by k0o9 2020. 7. 17.

이 글은 윈도우 시스템 해킹가이드 버그헌팅과 익스플로잇을 보고 정리한 글입니다.

 

쉘코드 만드는 방법을 간단하게 다뤄보겠습니다. 말이 쉘코드지 직접 공격코드를 다루지 않고 어떻게 쉘코드를 만드는지 증명하는 PoC(Proof of Concept)형식으로  cmd 호출 쉘코드를 작성하겠습니다.

 

실습 환경 : Windows 7  Sp1 /32비트 , visual c++ express 2010 

사전 지식 : c언어,어셈블리어,파이썬,윈도우 시스템 프로그래밍(약간)

 

shellcode.cpp

cmd문자를 담은 cmd 배열을 선언 후 WinExec(cmd,SW_SHOW)함수를 실행해 실제 윈도우에서 저 문자열을 명령어로 실행시켜줍니다. 자 그러면 이제 이 C언어를 어셈블리어로 변환해보겠습니다. 어셈블리어로 보기 위해서는 main내에 break point를 걸어주고 디버깅모드로 진입합니다 

그후 이렇게 우클릭을 누르고 저기 보이는 디스어셈블리로 이동을 클릭해줍니다. 

쉘코드 어셈블리어

자 그러면 이렇게 c언어가 어셈블리어로 변환된 것을 볼 수 있습니다.  이제 이 어셈블리어에서 필요한 부분만 추출할게요. 우리는 cmd를 실행시킬테니 필요한 부분은 cmd 문자열과 WinExec함수 호출 그리고 ExitProcess 함수 호출 이렇게 세 부분이겠네요 그러면 

__asm{
 mov         byte ptr [ebp-4],63h  
 mov         byte ptr [ebp-3],6Dh  
 mov         byte ptr [ebp-2],64h  
mov         byte ptr [ebp-1],0  
 push        5  
 lea         eax,[ebp-4]  
 push        eax 
 mov  eax, 0x760cf57e
 call        eax  
 push        1  
 mov  eax,0x7609bed2
 call        eax  

}

이렇게 되겠네요. 자 이제 여기 보면 call 함수명에서 특정한 주소가 들어가네요. 저 주소는 WinExec와 ExitProcess 함수 주소값입니다. 이제 저 주소를 구할려면 파이썬 스크립트를 사용하시면 됩니다.

getproc.py

 

파이썬스크립트를 이용해서 두 함수의 주소를 구해서 각각의 위치에 넣어주면 됩니다. 여기서 주의해야 할 점은 윈도우 7이상부터는 부팅때마다 kernel32.dll주소 값이 바뀌게 됩니다.  따라서 저 주소값은 부팅때마다 달라져요. 그래서 실제로는 동적으로 구하셔서 쉘코드를 짜시는게 좋습니다. 

이제 이 어셈블리어를 바이트 코드로 보시면 쉘코드 추출이 끝납니다. 바이트 코드 보는 방법은 아까처럼 어셈블리어 모드로 들어가서 보기 옵션에서 바이트 코드 보기를 누르시면 됩니다.

자 이렇게 바이트 코드 추출 후 이제 프로젝트 -> 속성 -> 링커 ->고급 ->dep를 아니요로 바꿔주고 실행시킵니다.

#include "stdafx.h"
char shellcode[]="\xc6\x45\xfc\x63"
 "\xc6\x45\xfd\x6d"
     "\xc6\x45\xfe\x64"
 "\xc6\x45\xff\x00"
 "\x6a\x05"
 "\x8d\x45\xfc"
 "\x50"
 "\xb8\x7e\xf5\x0c\x76"
 "\xff\xd0"
 "\x6a\x01"
 "\xb8\xd2\xbe\x09\x76"
 "\xff\xd0";

int _tmain(int argc, _TCHAR* argv[])
{
int * shell=(int*)shellcode;
__asm{
jmp shell
};

자 이러면 쉘코드 추출이 끝났습니다. 이런식으로 실제 공격 프로그램을 만들고 쉘코드를 제작합니다. 

'System' 카테고리의 다른 글

Universal Shellcode(4)-실습  (0) 2020.07.20
Universal Shellcode(3) -실습  (0) 2020.07.18
Universal Shellcode(2) - offset 구하기  (0) 2020.07.18
Universal Shellcode (1) (dll 시작주소 알기)  (0) 2020.07.18
쉘코드-널바이트 제거  (0) 2020.07.18