2016-07-02 3 views
1

그래서 최근에 저의 저수준 프로그래밍 언어에 대해 배우고 있습니다. (예 : Assembly, 상징적 인 바이너리 임) Shellcoding (예 : "\ x4D ..."등)을 접하게되었습니다. C/C++ 응용 프로그램에 Shellcode를 입력 한 다음 실행할 수 있다는 것을 알았습니다. 내 질문은 기존 exe 응용 프로그램에서 Shellcode를 생성 한 다음 C/C++ 응용 프로그램에서이 생성 된 Shellcode를 사용할 수 있습니까? 내가 셸 코딩의 가능성을 오해 했습니까? 많은 감사 - 낮은 수준의 프로그래밍exe에서 셸 코드 생성?

+0

몇 가지주의 사항 : 어셈블리는 * 기계어 * (CPU에 무엇을 할 지 알려주는 일련의 숫자)의 상징적 인 형태이며, 이진법은 숫자를 쓰는 단순한 방법이며 (기계어 코드와 관련이 없음) "\ x4D"는 숫자를 쓰는 방법이기도 한 16 진수 표기법입니다 (쉘 코드와 관련 없음). 셸 코드는 악의적 인 공격의 페이로드로 사용되는 컴퓨터 코드 일뿐입니다. – Wyzard

답변

0

에 매우 제한된 지식을 가진 사람은 가능한이는 C/C++ 응용 프로그램

대답에 쉘 코드를 생성 기존 EXE 응용 프로그램에서 쉘 코드를 생성하고 사용하는 것입니다 : 아니요. 쉘 코드는 기본에 의존하지 않고 실행 가능한 PE 파일에는 많은 양의 헤더가 있습니다. 일부 작업을 수행하기 전에 실행할 수 없습니다./

쉘 코드 - 매우 큰 질문입니다.

우선 kernel32, user32 libs 등과 같은 외부 라이브러리의 기능 주소는 시작 시간에 windows-loader로 채워진 Import Adress Table에 저장된다는 것을 알아야합니다. 모든 메모리 작업은 컴파일 단계에서 계산되는 주소로 수행됩니다. 그래서 당신은 스스로 addreses를 찾아야합니다.

쉘 코드에서 함수를 호출하려면 고유 한 함수 주소 로더가 있어야합니다. 이 로더는 "델타 오프셋"

call delta 
delta: 
pop  ebp 
sub  ebp,offset delta 
전화,

당신은 당신의 쉘 코드를로드 할 수있게됩니다 무엇인지 잘 모릅니다

, 당신은 이러한 코드에서 알 수 KERNEL32.DLL 라이브러리를로드 GetProcAddress를 함수를 검색하고 IAT를 채우기 위해해야한다 이후,

lea eax, [variable] 
add eax, ebp; adding a delta-offset 
mov ecx, dword ptr DS:[eax] 

당신이 FASM 같은 것을 사용하여야 미래에 대한 코드를 컴파일하려면 다음

은 이제 EBP에 그래서 당신이 플러스 오프셋, 예를 들어 필요한 함수 주소의 변수를 얻기 위해, 실제 addreses 오프셋 (offset) WinHex 편집기 사용 -> 복사 -> 모두 복사 -> GREP C 소스

그리고 당신은 같은 것을 얻을 것이다 "\ x00부터 \ X28"등, 당신이 등/JMP/호출 등의 명령 핸들러에 의해 EIP를 쉘 코드 배열에 실행 권한을 설정 및 변경할 필요가 호출하는

안녕하세요 윈도우 시스템에서 보여주는 예제, 세계 메시지 박스

# include <stdlib.h> 
# include <stdio.h> 
# include <string.h> 

# include <windows.h> 


int 
main(void) 
{ 
    char *shellcode = "\x33\xc9\x64\x8b\x49\x30\x8b\x49\x0c\x8b" 
    "\x49\x1c\x8b\x59\x08\x8b\x41\x20\x8b\x09" 
    "\x80\x78\x0c\x33\x75\xf2\x8b\xeb\x03\x6d" 
    "\x3c\x8b\x6d\x78\x03\xeb\x8b\x45\x20\x03" 
    "\xc3\x33\xd2\x8b\x34\x90\x03\xf3\x42\x81" 
    "\x3e\x47\x65\x74\x50\x75\xf2\x81\x7e\x04" 
    "\x72\x6f\x63\x41\x75\xe9\x8b\x75\x24\x03" 
    "\xf3\x66\x8b\x14\x56\x8b\x75\x1c\x03\xf3" 
    "\x8b\x74\x96\xfc\x03\xf3\x33\xff\x57\x68" 
    "\x61\x72\x79\x41\x68\x4c\x69\x62\x72\x68" 
    "\x4c\x6f\x61\x64\x54\x53\xff\xd6\x33\xc9" 
    "\x57\x66\xb9\x33\x32\x51\x68\x75\x73\x65" 
    "\x72\x54\xff\xd0\x57\x68\x6f\x78\x41\x01" 
    "\xfe\x4c\x24\x03\x68\x61\x67\x65\x42\x68" 
    "\x4d\x65\x73\x73\x54\x50\xff\xd6\x57\x68" 
    "\x72\x6c\x64\x21\x68\x6f\x20\x57\x6f\x68" 
    "\x48\x65\x6c\x6c\x8b\xcc\x57\x57\x51\x57" 
    "\xff\xd0\x57\x68\x65\x73\x73\x01\xfe\x4c" 
    "\x24\x03\x68\x50\x72\x6f\x63\x68\x45\x78" 
    "\x69\x74\x54\x53\xff\xd6\x57\xff\xd0"; 

    DWORD why_must_this_variable; 
    BOOL ret = VirtualProtect (shellcode, strlen(shellcode), 
    PAGE_EXECUTE_READWRITE, &why_must_this_variable); 

    if (!ret) { 
    printf ("VirtualProtect\n"); 
    return EXIT_FAILURE; 
    } 

    printf("strlen(shellcode)=%d\n", strlen(shellcode)); 

    ((void (*)(void))shellcode)(); 

    return EXIT_SUCCESS; 
} 

당신은 아마 RunPE 알고리즘을 찾고 있습니다. 이 알고리즘은 다른 PE 내부에서 PE 실행 파일을 실행할 수 있습니다. 다른 프로세스를 열고, 섹션을 복사하고, IAT 테이블을 채우고, 새로운 진입 점에서 대상 프로세스를 다시 시작합니다. 그것은 코드 삽입 기법으로, 내 악성 코드를 사용합니다. 그래서 나는 그것을 실현하는 방법을 설명하지 않을 것입니다

-1

는 악용의 페이로드 (예 : buffer overflow)로 사용되는 기계어입니다. 사용 된 악용에 따라 최대 길이 또는 허용되지 않는 특정 바이트 값 (예 : 0)과 같은 제한 사항이있을 수 있습니다. 쉘 코드가 될 수있는 것에는 아무런 대답이 없습니다.

일반적으로 : 예, 원칙적으로 쉘 코드에 전체 프로그램을 포함시킬 수 있습니다.새로운 .exe 파일에 프로그램을 쓴 다음 실행하거나 더 복잡한 기술을 사용하여 메모리의 현재 프로그램을 대체 할 수있는 소형 래퍼 (아마도 어셈블리로 직접 작성된)의 형태를 취할 수 있습니다. 이런 종류의 셸 코드를 생성하는 자동화 된 도구가있을 수 있습니다 만, 구체적으로는 알지 못합니다.

난 당신이 입력 쉘 코드가 C 다음/C++ 응용 프로그램과로에게

을 실행할 수 있다는 것을 발견 :

그러나, 귀하의 질문의 톤은 내가 당신이 중요한 무언가를 오해 할 수 있다고 생각합니다

이것은 기능이 아니라 버그입니다. 실행중인 프로그램에 새 코드를 주입 ​​할 수있는 프로그램이 있는데, 프로그램이이를 허용하지 않는 것이 주요 보안 결함입니다. 이런 종류의 일은 지난 수십 년 동안 엄청난 보안 침해의 근원이었으며 개발자는 발생하지 못하도록 많은 노력을 기울였습니다.

쉘 코드를 프로그램에 삽입 할 수있는 경우 프로그램이 손상됩니다.