Kali-KM_Security Study

메모리에서 특정 코드로 시작하는 스레드를 찾는 코드이다. 주로 코드 인젝션을 통해 다른 프로세스에 코드가 인젝션 되었는지 확인할 때 사용하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <Windows.h>
#include <iostream>
#include <TlHelp32.h>
 
#define ThreadQuerySetWin32StartAddress 9  
 
using namespace std;
typedef NTSTATUS(WINAPI *NtQueryInformationThreadT)(HANDLE ThreadHandle, ULONG ThreadInformationClass, PVOID ThreadInformation, ULONG ThreadInformationLength, PULONG ReturnLength);
 
BOOL GetThreadStartAddress(DWORD tid, PVOID *EntryPoint);
BOOL CompareBinary(CHAR Buffer[]);
 
int main()
{
    BOOL result;
    THREADENTRY32 t32;
    PVOID EntryPoint;
    HANDLE hProc;
    CHAR Buffer[0x100];
    DWORD NumberofByteRead;
    HANDLE hSnap;
 
    printf("\n[*] Memory Detection - Reverse_L01.exe\n");
 
    /* Create a Snapshot Handle */
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
    if (hSnap == INVALID_HANDLE_VALUE)
        return 0;
 
    /* if you don't initialize THREADENTRY32.dwSize, Thread32First API fails */
    t32.dwSize = sizeof(THREADENTRY32);
    if (Thread32First(hSnap, &t32))
    {
        do
        {
            result = GetThreadStartAddress(t32.th32ThreadID, &EntryPoint);
            if ((DWORD)EntryPoint == 0x1)
            {
                continue;
            }
            hProc = OpenProcess(PROCESS_VM_READ, 0, t32.th32OwnerProcessID);
            ReadProcessMemory(hProc, EntryPoint, Buffer, 0x100&NumberofByteRead);
 
            if (CompareBinary(Buffer))
            {
                printf("\t+ Detect It, Process ID : %d, Thread ID : %d, EntryPoint :0x%X\n", t32.th32OwnerProcessID, t32.th32ThreadID, EntryPoint);
            }
        } while (Thread32Next(hSnap, &t32));
    }
    CloseHandle(hSnap);
    
    return 0;
}
 
BOOL GetThreadStartAddress(DWORD tid, PVOID *EntryPoint)
{
    PVOID ThreadInfo;
    ULONG ThreadInfoLength;
    PULONG ReturnLength;
 
    HMODULE hNtdll = LoadLibrary("ntdll.dll");
    NtQueryInformationThreadT NtQueryInformationThread = (NtQueryInformationThreadT)GetProcAddress(hNtdll, "NtQueryInformationThread");
    
    if (!NtQueryInformationThread)
        return FALSE;
 
    /* if NtQueryInformationThread's THREADINFOCALSS is a ThreadQurtySetWin32StartAddress, return start address of thread */
    HANDLE hThread = OpenThread(THREAD_QUERY_INFORMATION, 0, tid);
    NTSTATUS NtStat = NtQueryInformationThread(hThread, ThreadQuerySetWin32StartAddress, &ThreadInfo, sizeof(ThreadInfo), NULL);
    
    *EntryPoint = ThreadInfo;
    return TRUE;
}
 
BOOL CompareBinary(CHAR Buffer[])
{
    char CmpCode[0x67= { '\x6A''\x00''\x68''\x00''\x20''\x40''\x00''\x68''\x12''\x20''\x40''\x00',
        '\x6A''\x00''\xE8''\x4E''\x00''\x00''\x00''\x68''\x94''\x20''\x40''\x00''\xE8''\x38',
        '\x00''\x00''\x00''\x46''\x48''\xEB''\x00''\x46''\x46''\x48''\x3B''\xC6''\x74''\x15',
        '\x6A''\x00''\x68''\x35''\x20''\x40''\x00''\x68''\x3B''\x20''\x40''\x00''\x6A''\x00',
        '\xE8''\x26''\x00''\x00''\x00''\xEB''\x13''\x6A''\x00''\x68''\x5E''\x20''\x40''\x00',
        '\x68''\x64''\x20''\x40''\x00''\x6A''\x00''\xE8''\x11''\x00''\x00''\x00''\xE8''\x06',
        '\x00''\x00''\x00''\xFF''\x25''\x50''\x30''\x40''\x00''\xFF''\x25''\x54''\x30''\x40',
        '\x00''\xFF''\x25''\x5C''\x30''\x40''\x00' };
 
    for (int i = 0; i < sizeof(CmpCode); i++)
    {
        if ((BYTE)CmpCode[i] != (BYTE)Buffer[i])
        {
            return FALSE;
        }
    }
    return TRUE;
}
 
cs




Comment +0

아주 기초적인 DLL 파일로 지정된 경로(코드에선 Kali\Dekstop)에 아무런 내용이 없는 txt 파일을 만드는 코드이다.

아래 코드는 DLL 을 로드하기 위한 EXE 파일의 코드이다.


Comment +0

지정한 핸들의 파일이 PE 파일인지 확인하는 코드이다. MZ 헤더와 PE 시그니쳐를 확인하며, 실제 파일의 크기가 PE 구조에 나타난 크기보다 작지는 않는지 확인한다. PE 구조를 파싱하는 부분은 아래와 동일하므로 조금씩 수정하면 다른 부분들도 확인할 수 있다.


Comment +0

인자로 지정한 경로에 존재하는 파일을 탐색하는 코드이다. 만약 폴더를 탐색하면 재귀를 통해 다시 그 안에 파일들까지 탐색한다. 컴파일러에 따라 "_CRT_SECURE_NO_WARNINGS"를 추가해주어야 하거나, "char * 형식의 인수가 LPCWSTR 형식의 매개 변수와 호환되지 않습니다" 라는 오류로 인해 유니코드 문자 집합 사용 설정을 해제해주어야 한다.



Comment +0

C 언어 정리

Programming/C2015. 8. 16. 13:35

#변수의 자료형

정수형 변수

실수형 변수


#대입연산자와 산술연산자

= +

- *

/ %


num+=1  //num=num+1


#증가,감소 연산자

++num --num

num++ num--


#관계 연산자

> <

>= <=

== !=


#논리연산자

&&:둘다참일떄 참반환

||:둘중하나참이면 참반환

! :A가 가짓이면 참반환.


#비트연산자

& : AND연산 // 두 비트가 모두 1일때 1일 반환

| : OR 연산 // 둘중 하나라도 1이면 1을 반환

^ : XOR 연산 // 두개가 서로 다를 경우에 1을 반환

~ : 비트반전시킴 // 0을 1로 반환, 1을 0으로 반환

<<: 비트 열의 좌이동 //num1<<2 2칸 왼쪽으로 이동

>>: 비트 열의 우이동 //num1>>2 2칸 오른쪽으로 이동


#정수의 표현방법

MSB(Most Significant Bit) : 부호를 나타낼떄 쓰인다.

0 0 0 0 0 0 0 0

맨앞이 MSB.


#자료형


정수형 char 1Byte

short 2Byte

int  4Byte

long 4Byte

long long 8Byte

실수형 float 4Byte

double 8Byte

long double 8Byte

****sizeof(int) sizeof(num1)

****scanf("%lf",&a);

double형 데이터를 입력받을때에는 서식문자 %lf를 사용


#unsigned 

unsigned가 붙으면 MSB 또한 범위를 나타내는 용도로 쓰이게 된다.


#ASCII Code

문자를 숫자로 표현하기 위하여 정의된 아스키 코드

//프로그램상에서의 문자표현은 ' '가 사용된다.

%c    %d

'A' = 65

'Z' = 90


#자료형의 변환

int num1 = 3;

double num2= 2.5*(double)num1;

...

#특수문자의 종류

\a :경고음

\b :백스페이스

\f :폼피드

\n :개행

\r :캐리지 리턴

\t :수평탭

\v :수직탭

\' :'출력

\" :"출력

\? :?출력

\\ :역슬래쉬출력


#서식문자의 종류와 의미

%d  : 부호있는 10진수

%ld : 부호있는 10진수

%lld: 부호있는 10진수

%u  : 부호없는 10진수

%o  : 부호없는 8진수

%x  : 부호없는 16진수

%f  : 10진수의 실수

%Lf : 10진수의 실수

%e  : e방식의 실수

%g  : 값에따라 %f, %e 사이에서 선택

%c  : 값에 대응하는 문자

%s  : 문자열

%p  : 포인터의 주소값

//%#o %#x로 출력할경우 07 0x07로 출력


#필드 폭 지정하여 출력하기

%8d : 필드 폭 8칸 확보하고 우정렬 하여 출력

%-8d: 필드 폭 8칸 확보하고 좌정렬 하여 출력



#반복문

while(조건식)

for(초기식;조건식;증감식)

#반복문의 생략과 탈출

continue : 뒤를 생략하고 다시 반복조건을 확인하러 간다.

break : 가장 가까이에 포함된 반복문을 빠져 나오게 된다.


#조건문

if..if..if

if..else if..else

//조건연산자

(조건) ? data1 : data2

num1>num2?num1:num2;

return a<b ?a:b;

#switch

switch(num)

{

case 1:

puts("1 = one");

break;

case 'a':

puts("a = A");

break;

default:

puts("I Don't Know..");

}

return 0;


#GOto문

if(n==1)

goto ONE;

...

ONE:

printf("input 1 \n");

goto END;

TWO:

printf("input 2 \n");

goto END;

OTHER:

printf("3 or other num..\n");

END:

return 0;


#함수 활용하기

   -인자0,반환0

int Add(int n1,int n2)

{

return n1+n2;

}

   -인자0,반환x

ShowAdd(int num)

{

printf("덧셈결과 : %d\n",num);

}

   -인자x,반환0

int Readnum()

{

int num;

scanf("%d",&num);

return num;

}

   -인자x.반환x

Howto()

{

puts("Explain...");

}


#지역변수

선언된 함수내에서만 접근이 가능

선언된 함수가 반환하면 지역변수와 마찬가지로 소멸.

중괄호내에서만 적용됨


반복문과 조건문에서 또한 선언가능

반복문에서 선언시 탈출과 진입을 여러번 반복한다.

그러므로 반복문내에서 초기화 할경우

반복 할때마다 초기화가 이루어진다.


#전역변수

지역변수와 동일한 이름으로 선언이 된다면?

 해당 지역내에서는 전역변수가 가려지고 지역변수로의 접근이 이루어짐

#Static변수

선언된 함수내에서만 접근이 가능

딱 1회 초기화되고 프로그램 종료시까지 메모리 공가에 존재.


static int num1=0;

*주로 반복문의 변수선언에 쓰면 적당.

탈출과 진입으로 인해 매번초기화되지않고 1회만 초기화되어

유지되기에.

#재귀함수

함수내에서 자신을 다시 호출하는 함수

Recursive()

{

printf("Test..\n");

Recursive();

}

:wq

Recursive(int num)

{

if(num<=0)

return;

printf("Call.. %d\n",num);

Recursive(num-1);

}

:wq


#1차원 배열

int arr[5]={1,2};

=>> 1 2 0 0 0

arrlen=sizeof(arr)/sizeof(int)


#문자열 변수표현

char str[14]="Good Morning!";

 NULL을 포함하여 14byte가 사용.

null='\0'

문자열을 입력받을때에는 배열의 이름앞에 '&'를 붙이면 안된다.

scanf함수호출을 통해서 입력받은 문자열의 끝에도 널문자가 삽입됨

C언어에서 표현하는 모든 문자열의 끝에는 널문자가 삽입됨.



#포인터

포인터변수란 메모리의 주소값을 저장하기 위한 변수이다.

int num;

int *pnum;

pnum=&num;


&num : 변수 num의 주소값

pnum = &num

pnum에는 num의 시작 주소가 위치하여 있다.


#포인터 &연산자와 *연산자

: 피연산자의 주소값을 반환하는 연산자

피연산자는 변수이여야하며, 상수는 피연산자가 될수없다.

: 포인터가 가리키는 메모리를 참조하는 연산자

*pnum=20;

pnum이 가리키는 메모리공간 변수num에 접근을하여...

사실상 *pnum은 변수num의 값을 의미하는것이다


#포인터와 배열의 관계

배열의 이름은 포인터이다.

arr= &arr[0]

arr[1] = *(arr+1) = *(ptr+1)

ptr[1] =  *(ptr+1)

>>>>[]와 * 둘중 하나라도 있다면 그것은 값을 나타낸다는 뜻이다.

포인터를 배열의 이름처럼 사용가능

int arr[i];

int *ptr;

ptr=arr; //ptr = &arr[0];

printf("%d\n",ptr[i]);

   ########## arr[i] = *(arr+i) ##### [] or * #############

*(ptr+0), *(ptr+1), *(ptr+2)

ptr[0]   ptr[1] ptr[2]

*(arr+0), *(arr+1), *(arr+2)

arr[0]   arr[1] arr[2]

열별로 모두 같은 값이다.

==========================================

#include <stdio.h>


main()

{

        int arr[6]={1,2,3,4,5,6};

        int *fp=&arr[0];

        int *bp=&arr[5];

        int i,temp;


        for(i=0;i<3;i++)

        {

                temp=*fp;

                *fp=*bp;

                *bp=temp;


                fp++;

                bp--;

        }

        for(i=0;i<6;i++)

        {

                printf("%d ",arr[i]);

        }

}

===========================================

#상수형태의 문자열을 가리키는 포인터

char str1[] = "My String"; //배열길이 자동계산

char *str2 = "Your String"; //문자열의 첫번째 주소값반환

str1 : 그자체로 문자열 전체를 저장하는 배열

str2 : 메모리상에 저장된 문자열의 첫번째 문자만 단순히 가리키고있음.


printf("Show your string");

printf(0x1234);

***""로 묶여서 표현되는 문자열은 그 형태에 상관없이 메모리 공간에 저장 된후 그 주소값이 반환된다.

그러므로 printf 함수는 문자열을 통째로 전달받는 함수가 아닌, 문자열의 주소값을 전달받는 함수이다.


#포인터배열

포인터배열 : 주소값의 저장이 가능한 배열

int *arr[3]={&n1,&n2,&n3};

printf("%d %d %d \n", *arr[0],*arr[1],*arr[2]);


[]와 *가 동시에 있다면 그것은 포인터배열이다.


#문자열을 저장하는 포인터배열

char *strarr[3]={"123","456","789"};

printf("%s",strarr[0]);

 

==char *strarr[3]={0x1004,0x1048,0x2012};



Comment +0

Error:

Visual Studio 2013

Class not registered. Looking for object with CLSID: {3B6A8A95-60A9-4EFC-AB17-DD892979B105}. 


Solution:

CMD<admin>

cd C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE

devenv.exe /setup




'Programming > C' 카테고리의 다른 글

[C & C++] Search a file - 파일 탐색  (0) 2016.08.24
C 언어 정리  (0) 2015.08.16
VisualSstudio 2013 Error : Class not registered. Looking for object with CLSID: {3B6A8A95-60A9-4EFC-AB17-DD892979B105}  (0) 2015.07.17
getaddr.c  (0) 2015.05.06
EggShell.c  (0) 2015.05.06
MsgBox.dll  (1) 2015.03.22

Comment +0

getaddr.c

Programming/C2015. 5. 6. 21:28



'Programming > C' 카테고리의 다른 글

C 언어 정리  (0) 2015.08.16
VisualSstudio 2013 Error : Class not registered. Looking for object with CLSID: {3B6A8A95-60A9-4EFC-AB17-DD892979B105}  (0) 2015.07.17
getaddr.c  (0) 2015.05.06
EggShell.c  (0) 2015.05.06
MsgBox.dll  (1) 2015.03.22
Make Simple AutoRun  (0) 2015.02.26

Comment +0

EggShell.c

Programming/C2015. 5. 6. 10:29



'Programming > C' 카테고리의 다른 글

VisualSstudio 2013 Error : Class not registered. Looking for object with CLSID: {3B6A8A95-60A9-4EFC-AB17-DD892979B105}  (0) 2015.07.17
getaddr.c  (0) 2015.05.06
EggShell.c  (0) 2015.05.06
MsgBox.dll  (1) 2015.03.22
Make Simple AutoRun  (0) 2015.02.26
Make Simple Bat File  (0) 2015.02.26

Comment +0

MsgBox.dll

Programming/C2015. 3. 22. 22:24


msgbox.dll



'Programming > C' 카테고리의 다른 글

getaddr.c  (0) 2015.05.06
EggShell.c  (0) 2015.05.06
MsgBox.dll  (1) 2015.03.22
Make Simple AutoRun  (0) 2015.02.26
Make Simple Bat File  (0) 2015.02.26
C언어 요약정리  (0) 2015.01.10

Comment +1

Autorun

 

Autorun USB CD를 인식시켰을 때 내장되어있는 파일을 자동으로 실행하게 하는 간단한 명령문이다. 만드는 방법 또한 간단한데 메모장에 명령문을 입력하고 .inf 확장자로 저장을 해주면 된다.

[autorun]

Open=file.exe

 

이것이 전부이다. Exe 파일 말고도 모든파일이 실행 가능하다.

응용을 생각해본다면

[autorun]

Open=example.bat        라 입력을 한 후 그 폴더 안에 example.bat 파일을 만들어 자동 cmd 명령을 치게하는 것이다. 만약 bat 파일의 내용이 shutdown –s 이라면 usb cd를 인식 시켰을때, 자동으로 컴퓨터를 종료하게 하는 usb cd를 만드는 것이다.

'Programming > C' 카테고리의 다른 글

getaddr.c  (0) 2015.05.06
EggShell.c  (0) 2015.05.06
MsgBox.dll  (1) 2015.03.22
Make Simple AutoRun  (0) 2015.02.26
Make Simple Bat File  (0) 2015.02.26
C언어 요약정리  (0) 2015.01.10

Comment +0