'과거의 컴퓨터 공부'에 해당하는 글 152건

반응형

Gaussian Process.pdf



반응형
,
반응형

[source]

쿠키 변조를 할 수 있는지를 물어보는 문제이다.

Cooxie Toolbar라는 쿠키 변조 프로그램을 이용해서 쿠키가 5초과 이면서 6미만인 값으로 쿠키 user_lv를 변조해주면 되는 문제다.

즉, float 형식으로 user_lv 값을 넣어주면 된다. 

[clear]


반응형

'과거의 컴퓨터 공부 > Webhacking.kr_write_up' 카테고리의 다른 글

회원가입 문제  (0) 2015.10.11
,
반응형

Webhacking.kr 회원 가입이다.

웹해킹 사이트라 그런지 회원 가입부터 문제이다.

메인 홈페이지를 살펴보면  회원가입 버튼은 존재하지 않고 Login 밖에 존재하지 않는다.

개발자도구를 사용해서 메인 홈페이지를 살펴보면 

Register 버튼이 주석 처리 되어있는 것을 확인할 수 있다.

따라서 주석을 지워주면,

Register 버튼이 나타남을 확인할 수 있다.

Register 버튼을 눌러 진입하면,

ID/PW/EMAIL/Decode_Me를 확인할 수 있다.

여기서 Decode_Me 박스안에있는 값을 복호화 하지않고 Submit하게 되면 Wrong페이지로 넘어가기 때문에

암호를 해독해주어야 회원가입에 성공할 수 있다.

위의 암호문은 Base64로 암호화된 String이다.

Base64 암호문의 특징은 의미가 있어보이는 String, String의 끝에 =/==이 붙는다는 점이다. 

웹으로 지원하는 Base64 deceoder를 사용하여 몇차례 반복하다보면 의미가 있는 값이 나타나게 된다.

그 값을 넣어준뒤 Submit 하게되면 회원가입에 성공하게 된다.


[Success]


반응형

'과거의 컴퓨터 공부 > Webhacking.kr_write_up' 카테고리의 다른 글

prob1  (0) 2015.10.11
,
반응형

headers.h ,codes.h에 선언된 내용들 끌어와 machine, subsystem, Characteristics에

 상황에 맞게 값이 들어가도록 case 선언해주는 부분이다

실질적으로 끌어와서 써주는 부분이라 PE manual에서 reserved로 선언된 부분이 있는데

그부분을 볼수있다 

어제도 포스팅 하면서 말햇지만 확실히 이번에 본 소스가 예전에 봣던 소스보다 훨씬 낫다 ㅡㅡ ; 

#ifndef UTILS_H_

#define UTILS_H_

#include <math.h>


#include “header.h”

#include “codes.h”

//machine type case 문

char* read_machine_type(PE_Header* pe_head)

{

  switch(pe_head->Machine)

  {

    case 0x0:

      return IMAGE_FILE_MACHINE_UNKNOWN;

      break;

    case 0x1d3:

      return IMAGE_FILE_MACHINE_AM33;

      break;

    case -31132:

      return IMAGE_FILE_MACHINE_AMD64;

      break;

    case 0x1c0:

      return IMAGE_FILE_MACHINE_ARM;

      break;

    case 0x1c4:

      return IMAGE_FILE_MACHINE_ARMNT;

      break;

    case 0xaa64:

      return IMAGE_FILE_MACHINE_ARM64;

      break;

    case 0xebc:

      return IMAGE_FILE_MACHINE_EBC;

      break;

    case 0x14c:

      return IMAGE_FILE_MACHINE_I386;

      break;

    case 0x200:

      return IMAGE_FILE_MACHINE_IA64;

      break;

    case 0x9041:

      return IMAGE_FILE_MACHINE_M32R;

      break;

    case 0x266:

      return IMAGE_FILE_MACHINE_MIPS16;

      break;

    case 0x366:

      return IMAGE_FILE_MACHINE_MIPSFPU;

      break;

    case 0x466:

      return IMAGE_FILE_MACHINE_MIPSFPU16;

      break;

    case 0x1f0:

      return IMAGE_FILE_MACHINE_POWERPC;

      break;

    case 0x1f1:

      return IMAGE_FILE_MACHINE_POWERPCFP;

      break;

    case 0x166:

      return IMAGE_FILE_MACHINE_R4000;

      break;

    case 0x1a2:

      return IMAGE_FILE_MACHINE_SH3;

      break;

    case 0x1a3:

      return IMAGE_FILE_MACHINE_SH3DSP;

      break;

    case 0x1a6:

      return IMAGE_FILE_MACHINE_SH4;

      break;

    case 0x1a8:

      return IMAGE_FILE_MACHINE_SH5;

      break;

    case 0x1c2:

      return IMAGE_FILE_MACHINE_THUMB;

      break;

    case 0x169:

      return IMAGE_FILE_MACHINE_WCEMIPSV2;

      break;

    default:

      return "...";

      break;

  }

}


//subsystem case문 

char* read_windows_subsystem_pe32(PE_Optional_Header* pe_opt_head)

{

  switch(pe_opt_head->Subsystem)

  {

    case 0:

      return IMAGE_SUBSYSTEM_UNKNOWN;

      break;

    case 1:

      return IMAGE_SUBSYSTEM_NATIVE;

      break;

    case 2:

      return IMAGE_SUBSYSTEM_WINDOWS_GUI;

      break;

    case 3:

      return IMAGE_SUBSYSTEM_WINDOWS_CUI;

      break;

    case 7:

      return IMAGE_SUBSYSTEM_POSIX_CUI;

      break;

    case 9:

      return IMAGE_SUBSYSTEM_WINDOWS_CE_GUI;

      break;

    case 10:

      return IMAGE_SUBSYSTEM_EFI_APPLICATION;

      break;

    case 11:

      return IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;

      break;

    case 12:

      return IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER;

      break;

    case 13:

      return IMAGE_SUBSYSTEM_EFI_ROM;

      break;

    case 14:

      return IMAGE_SUBSYSTEM_XBOX;

      break;

    default:

      return "...";

      break;

  }

}


//64bit의 subsystem case문 

char* read_windows_subsystem_pe32_plus(PE_Optional_Header_Plus* pe_opt_head)

{

  switch(pe_opt_head->Subsystem)

  {

    case 0:

      return "IMAGE_SUBSYSTEM_UNKNOWN";

      break;

    case 1:

      return "IMAGE_SUBSYSTEM_NATIVE";

      break;

    case 2:

      return "IMAGE_SUBSYSTEM_WINDOWS_GUI";

      break;

    case 3:

      return "IMAGE_SUBSYSTEM_WINDOWS_CUI";

      break;

    case 7:

      return "IMAGE_SUBSYSTEM_POSIX_CUI";

      break;

    case 9:

      return "IMAGE_SUBSYSTEM_WINDOWS_CE_GUI";

      break;

    case 10:

      return "IMAGE_SUBSYSTEM_EFI_APPLICATION";

      break;

    case 11:

      return "IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER";

      break;

    case 12:

      return "IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER";

      break;

    case 13:

      return "IMAGE_SUBSYSTEM_EFI_ROM";

      break;

    case 14:

      return "IMAGE_SUBSYSTEM_XBOX";

      break;

    default:

      return "...";

      break;

  }

}


int* read_characteristics(PE_Header* pe_head)

{

int* flags = (int*)malloc(16);

int i = 0 ;

int is_set = 0 ;


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

{

if((pe_head->Characteristics & (1 << i)) == (1 << i))

 {

 flags[i] = 1;

 }

 }

 return flags;

 }


void print_characteristics(int* flags)

{

  if(flags[(int)log2(CHARACTERISTICS_RELOCS_STRIPPED)] == 1)

  {

    printf(IMAGE_FILE_RELOCS_STRIPPED);

    printf("\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_EXECUTABLE_IMAGE)] == 1)

  {

    printf(IMAGE_FILE_EXECUTABLE_IMAGE);

    printf("\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_LINE_NUMS_STRIPPED)] == 1)

  {

    printf(IMAGE_FILE_LINE_NUMS_STRIPPED);

    printf("\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_LOCAL_SYMS_STRIPPED)] == 1)

  {

    printf(IMAGE_FILE_LOCAL_SYMS_STRIPPED);

    printf("\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_AGGRESSIVE_WS_TRIM)] == 1)

  {

    printf(IMAGE_FILE_AGGRESSIVE_WS_TRIM);

    printf("\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_LARGE_ADDRESS_AWARE)] == 1)

  {

    printf(IMAGE_FILE_LARGE_ADDRESS_AWARE);

    printf("\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_reserved)] == 1)

  {

    printf("(reserved)\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_BYTES_REVERSED_LO)] == 1)

  {

    printf(IMAGE_FILE_BYTES_REVERSED_LO);

    printf("\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_32BIT_MACHINE)] == 1)

  {

    printf(IMAGE_FILE_32BIT_MACHINE);

    printf("\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_DEBUG_STRIPPED)] == 1)

  {

    printf(IMAGE_FILE_DEBUG_STRIPPED);

    printf("\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_REMOVABLE_RUN_FROM_SWAP)] == 1)

  {

    printf(IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP);

    printf("\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_NET_RUN_FROM_SWAP)] == 1)

  {

    printf(IMAGE_FILE_NET_RUN_FROM_SWAP);

    printf("\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_SYSTEM)] == 1)

  {

    printf(IMAGE_FILE_SYSTEM);

    printf("\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_DLL)] == 1)

  {

    printf(IMAGE_FILE_DLL);

    printf("\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_UP_SYSTEM_ONLY)] == 1)

  {

    printf(IMAGE_FILE_UP_SYSTEM_ONLY);

    printf("\n");

  }


  if(flags[(int)log2(CHARACTERISTICS_BYTES_REVERSED_HI)] == 1)

  {

    printf(IMAGE_FILE_BYTES_REVERSED_HI);

    printf("\n");

  }


  //free(flags); // free the heap memory we declared in read_characteristics

}


int* read_dll_characteristics_pe32(PE_Optional_Header* pe_opt_head)

{

  int* flags = (int*)malloc(16);

  int i = 0;

  int is_set = 0;

  

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

  {

    if((pe_opt_head->DllCharacteristics & (1 << i)) == (1 << i))

    {

      flags[i] = 1;

    }

  }


  return flags;

}


int* read_dll_characteristics_pe32_plus(PE_Optional_Header_Plus* pe_opt_head)

{

  int* flags = (int*)malloc(16);

  int i = 0;

  int is_set = 0;

  

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

  {

    if((pe_opt_head->DllCharacteristics & (1 << i)) == (1 << i))

    {

      flags[i] = 1;

    }

  }


  return flags;

}


void print_dll_characteristics(int* flags)

{

  if(flags[(int)log2(DLLCHARACTERISTICS_reserved1)] == 1)

  {

    printf("(reserved)\n");

  }


  if(flags[(int)log2(DLLCHARACTERISTICS_reserved2)] == 1)

  {

    printf("(reserved)\n");

  }


  if(flags[(int)log2(DLLCHARACTERISTICS_reserved3)] == 1)

  {

    printf("(reserved)\n");

  }


  if(flags[(int)log2(DLLCHARACTERISTICS_reserved4)] == 1)

  {

    printf("(reserved)\n");

  }


  if(flags[(int)log2(DLLCHARACTERISTICS_DYNAMIC_BASE)] == 1)

  {

    printf(IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE);

    printf("\n");

  }


  if(flags[(int)log2(DLLCHARACTERISTICS_FORCE_INTEGRITY)] == 1)

  {

    printf(IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY);

    printf("\n");

  }


  if(flags[(int)log2(DLLCHARACTERISTICS_NX_COMPAT)] == 1)

  {

    printf(IMAGE_DLLCHARACTERISTICS_NX_COMPAT);

    printf("\n");

  }


  if(flags[(int)log2(DLLCHARACTERISTICS_NO_ISOLATION)] == 1)

  {

    printf(IMAGE_DLLCHARACTERISTICS_NO_ISOLATION);

    printf("\n");

  }


  if(flags[(int)log2(DLLCHARACTERISTICS_NO_SEH)] == 1)

  {

    printf(IMAGE_DLLCHARACTERISTICS_NO_SEH);

    printf("\n");

  }


  if(flags[(int)log2(DLLCHARACTERISTICS_NO_BIND)] == 1)

  {

    printf(IMAGE_DLLCHARACTERISTICS_NO_BIND);

  }


  if(flags[(int)log2(DLLCHARACTERISTICS_reserved5)] == 1)

  {

    printf("(reserved)\n");

  }


  if(flags[(int)log2(DLLCHARACTERISTICS_WDM_DRIVER)] == 1)

  {

    printf(IMAGE_DLLCHARACTERISTICS_WDM_DRIVER);

    printf("\n");

  }


  if(flags[(int)log2(DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE)] == 1)

  {

    printf(IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE);

    printf("\n");

  }


  //free(flags); // free the heap memory we declared in read_dll_characteristics

}


#endif // UTILS_H_

반응형

'과거의 컴퓨터 공부 > PE Viewer 다시만들기 ' 카테고리의 다른 글

(PEViewer) codes.h  (0) 2015.06.01
(PEViewer)headers.h  (0) 2015.06.01
(PEViewer)Main.c  (0) 2015.05.31
PE viewer 다시 만들어보기  (0) 2015.05.31
,
반응형

// PE view  [codes.h]

// PE 에서 특정 값을 가져야하는 Machine,  flag, characteristics ,subsystem에서 사용하는 값들에 대한 값들을 선언해둠 

//딱히 이 부분은 일일이 타이핑해볼 이유가 없을것 같아  COPY &PASTE 하였다 .. 

//예전에 따라가본 소스코드는  구간이 명확하지 않아서 main부분이 좀많이 복잡햇는데 이번에 따라가보는 코드는

// 예전꺼에 비해 구간이 딱딱 떨어져 있어서 이해하기가 굉장히 쉽다 ( ㄱㅇㄷ ) 

//PE machine type code

#define IMAGE_FILE_MACHINE_UNKNOWN "IMAGE_FILE_MACHINE_UNKNOWN"

#define IMAGE_FILE_MACHINE_AM33 "IMAGE_FILE_MACHINE_AM33"

#define IMAGE_FILE_MACHINE_AMD64 "IMAGE_FILE_MACHINE_AMD64"

#define IMAGE_FILE_MACHINE_ARM "IMAGE_FILE_MACHINE_ARM"

#define IMAGE_FILE_MACHINE_ARMNT "IMAGE_FILE_MACHINE_ARMNT"

#define IMAGE_FILE_MACHINE_ARM64 "IMAGE_FILE_MACHINE_ARM64"

#define IMAGE_FILE_MACHINE_EBC "IMAGE_FILE_MACHINE_EBC"

#define IMAGE_FILE_MACHINE_I386 "IMAGE_FILE_MACHINE_I386"

#define IMAGE_FILE_MACHINE_IA64 "IMAGE_FILE_MACHINE_IA64"

#define IMAGE_FILE_MACHINE_M32R "IMAGE_FILE_MACHINE_M32R"

#define IMAGE_FILE_MACHINE_MIPS16 "IMAGE_FILE_MACHINE_MIPS16"

#define IMAGE_FILE_MACHINE_MIPSFPU "IMAGE_FILE_MACHINE_MIPSFPU"

#define IMAGE_FILE_MACHINE_MIPSFPU16 "IMAGE_FILE_MACHINE_MIPSFPU16"

#define IMAGE_FILE_MACHINE_POWERPC "IMAGE_FILE_MACHINE_POWERPC"

#define IMAGE_FILE_MACHINE_POWERPCFP "IMAGE_FILE_MACHINE_POWERPCFP"

#define IMAGE_FILE_MACHINE_R4000 "IMAGE_FILE_MACHINE_R4000"

#define IMAGE_FILE_MACHINE_SH3 "IMAGE_FILE_MACHINE_SH3"

#define IMAGE_FILE_MACHINE_SH3DSP "IMAGE_FILE_MACHINE_SH3DSP"

#define IMAGE_FILE_MACHINE_SH4 "IMAGE_FILE_MACHINE_SH4"

#define IMAGE_FILE_MACHINE_SH5 "IMAGE_FILE_MACHINE_SH5"

#define IMAGE_FILE_MACHINE_THUMB "IMAGE_FILE_MACHINE_THUMB"

#define IMAGE_FILE_MACHINE_WCEMIPSV2 “IMAGE_FILE_MACHINE_WCEMIPSV2"


//PE characteristics codes 

#define IMAGE_FILE_RELOCS_STRIPPED "IMAGE_FILE_RELOCS_STRIPPED"

#define IMAGE_FILE_EXECUTABLE_IMAGE "IMAGE_FILE_EXECUTABLE_IMAGE"

#define IMAGE_FILE_LINE_NUMS_STRIPPED "IMAGE_FILE_NUMS_STRIPPED"

#define IMAGE_FILE_LOCAL_SYMS_STRIPPED "IMAGE_FILE_SYMS_STRIPPED"

#define IMAGE_FILE_AGGRESSIVE_WS_TRIM "IMAGE_FILE_AGGRESSIVE_WS_TRIM"

#define IMAGE_FILE_LARGE_ADDRESS_AWARE "IMAGE_FILE_LARGE_ADDRESS_AWARE"

#define IMAGE_FILE_BYTES_REVERSED_LO "IMAGE_FILE_BYTES_REVERSED_LO"

#define IMAGE_FILE_32BIT_MACHINE "IMAGE_FILE_32BIT_MACHINE"

#define IMAGE_FILE_DEBUG_STRIPPED "IMAGE_FILE_DEBUG_STRIPPED"

#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP "IMAGE_FILE_REMOVEABLE_RUN_FROM_SWAP"

#define IMAGE_FILE_NET_RUN_FROM_SWAP "IMAGE_FILE_NET_RUN_FROM_SWAP"

#define IMAGE_FILE_SYSTEM "IMAGE_FILE_SYSTEM"

#define IMAGE_FILE_DLL "IMAGE_FILE_DLL"

#define IMAGE_FILE_UP_SYSTEM_ONLY "IMAGE_FILE_UP_SYSTEM_ONLY"

#define IMAGE_FILE_BYTES_REVERSED_HI “IMAGE_FILE_BYTES_REVERSED_HI"


//subsystem code

#define IMAGE_SUBSYSTEM_UNKNOWN "IMAGE_SUBSYSTEM_UNKNOWN"

#define IMAGE_SUBSYSTEM_NATIVE "IMAGE_SUBSYSTEM_NATIVE"

#define IMAGE_SUBSYSTEM_WINDOWS_GUI "IMAGE_SUBSYSTEM_WINDOWS_GUI"

#define IMAGE_SUBSYSTEM_WINDOWS_CUI "IMAGE_SUBSYSTEM_WINDOWS_CUI"

#define IMAGE_SUBSYSTEM_POSIX_CUI "IMAGE_SUBSYSTEM_POXIS_CUI"

#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI "IMAGE_SUBSYSTEM_WINDOWS_CE_GUI"

#define IMAGE_SUBSYSTEM_EFI_APPLICATION "IMAGE_SUBSYSTEM_EFI_APPLICATION"

#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER "IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER"

#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER "IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER"

#define IMAGE_SUBSYSTEM_EFI_ROM "IMAGE_SUBSYSTEM_EFI_ROM"

#define IMAGE_SUBSYSTEM_XBOX "IMAGE_SUBSYSTEM_XBOX"


// characteristics flag

#define CHARACTERISTICS_RELOCS_STRIPPED 0x0001

#define CHARACTERISTICS_EXECUTABLE_IMAGE 0x0002

#define CHARACTERISTICS_LINE_NUMS_STRIPPED 0x0004

#define CHARACTERISTICS_LOCAL_SYMS_STRIPPED 0x0008

#define CHARACTERISTICS_AGGRESSIVE_WS_TRIM 0x0010

#define CHARACTERISTICS_LARGE_ADDRESS_AWARE 0x0020

#define CHARACTERISTICS_reserved 0x0040

#define CHARACTERISTICS_BYTES_REVERSED_LO 0x0080

#define CHARACTERISTICS_32BIT_MACHINE 0x0100

#define CHARACTERISTICS_DEBUG_STRIPPED 0x0200

#define CHARACTERISTICS_REMOVABLE_RUN_FROM_SWAP 0x0400

#define CHARACTERISTICS_NET_RUN_FROM_SWAP 0x0800

#define CHARACTERISTICS_SYSTEM 0x1000

#define CHARACTERISTICS_DLL 0x2000

#define CHARACTERISTICS_UP_SYSTEM_ONLY 0x4000

#define CHARACTERISTICS_BYTES_REVERSED_HI 0x8000


//characteristics code

#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE "IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE"

#define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY "IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY"

#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT "IMAGE_DLL_CHARACTERISTICS_NX_COMPAT"

#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION "IMAGE_DLLCHARACTERISTICS_NO_ISOLATION"

#define IMAGE_DLLCHARACTERISTICS_NO_SEH "IMAGE_DLLCHARACTERISTICS_NO_SEH"

#define IMAGE_DLLCHARACTERISTICS_NO_BIND "IMAGE_DLLCHARACTERISTICS_NO_BIND"

#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER "IMAGE_DLLCHARACTERISTICS_WDM_DRIVER"

#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE “IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE"


//DLL characteristics flag

#define DLLCHARACTERISTICS_reserved1 0x0001

#define DLLCHARACTERISTICS_reserved2 0x0002

#define DLLCHARACTERISTICS_reserved3 0x0004

#define DLLCHARACTERISTICS_reserved4 0x0008

#define DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040

#define DLLCHARACTERISTICS_FORCE_INTEGRITY 0x0080

#define DLLCHARACTERISTICS_NX_COMPAT 0x0100

#define DLLCHARACTERISTICS_NO_ISOLATION 0x0200

#define DLLCHARACTERISTICS_NO_SEH 0x0400

#define DLLCHARACTERISTICS_NO_BIND 0x0800

#define DLLCHARACTERISTICS_reserved5 0x1000

#define DLLCHARACTERISTICS_WDM_DRIVER 0x2000

#define DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000


#endif // CODES_H_

반응형

'과거의 컴퓨터 공부 > PE Viewer 다시만들기 ' 카테고리의 다른 글

(PEViewer)utils.h  (0) 2015.06.02
(PEViewer)headers.h  (0) 2015.06.01
(PEViewer)Main.c  (0) 2015.05.31
PE viewer 다시 만들어보기  (0) 2015.05.31
,
반응형

// PE view [headers.h]

말그대로  헤더부분이여서 딱히 특별한 부분은 없다.. 원래 개발자도 intel 에서 제공하는 PE 메뉴얼을 보고  사이즈들을 지정해준것 같고, main부분에서  PE32 / PE32+(64bit)를  나눠주엇기 때문에 , 좀더 편하게 하기위해서  헤더부분에서도  32 비트와 64비트의 PE의 파라메터들을 각각 선언해 준것 같다. 

#ifndef HEADERS_H_

#define HEADERS_H_


typedef struct PE_Header // IMAGE_FILE_HEADER

{

char sig[4 * sizeof(char)];

short Machine;

short NumberOfSections;

int TimeDateStamp;

int PointerToSymbolTable;

int NumberOfSymbols;

short SIzeOfOptionalHeader;

short Characteristics;

} PE_Header;


typedef struct PE_Optional_Header //32bit 

{

short Magic;

char MajorLinkerVersion;

char MinorLinkerVersion;

int SizeOfCode;

int SizeOfinitializedData;

int SizeOfUninitializedData;

int AddressOfEntryPoint;

int BaseOfCode;

int BaseOfData;


//Windows-Specific

int ImageBase;

int SectionAlignment;

int FileAlignment;

short MajorOperationSystemVersion;

short MinorOperationSystemVersion;

short MajorImageVersion;

short MinorImageVersion;

short MajorSubsystemVersion;

short MinorSubsystemVersion;

int Win32VersionValue;

int SizeOfImage;

int SizeOfHeaders;

int Checksum;

short Subsystem;

short DllCharacteristics;

int SizeOfStackReserve;

int SizeOfStackCommit;

int SizeOfHeapReserve;

int SizeOfHeapCommit;

int LoaderFlags;

int NumberOfRvaAndSIzes;


//Data_Directory

long ExportTable;

long ImportTable;

long ResourceTable;

long ExceptionTable;

long CertificateTable;

long BaseRelocationTable;

long Debug;

long Architecture;

long GlobalPtr;

long TLSTable;

long LoadConfigTable;

long BoundImport;

long IAT;

long DelayImportDescriptor;

long CLRRuntimeHeader;

long reserved;

} PE_Optional_header;


typedef struct PE_Optional_Header_Plus // 64bit 

{

 short Magic;

char MajorLinkerVersion;

char MinorLinkerVersion;

int SizeOfCode;

int SizeOfinitializedData;

int SizeOfUninitializedData;

int AddressOfEntryPoint;

int BaseOfCode;

int BaseOfData;


//Windows-Specific

long ImageBase;

int SectionAlignment;

int FileAlignment;

short MajorOperationSystemVersion;

short MinorOperationSystemVersion;

short MajorImageVersion;

short MinorImageVersion;

short MajorSubsystemVersion;

short MinorSubsystemVersion;

int Win32VersionValue;

int SizeOfImage;

int SizeOfHeaders;

int Checksum;

short Subsystem;

short DllCharacteristics;

int SizeOfStackReserve;

int SizeOfStackCommit;

int SizeOfHeapReserve;

int SizeOfHeapCommit;

int LoaderFlags;

int NumberOfRvaAndSIzes;


//Data_Directory

long ExportTable;

long ImportTable;

long ResourceTable;

long ExceptionTable;

long CertificateTable;

long BaseRelocationTable;

long Debug;

long Architecture;

long GlobalPtr;

long TLSTable;

long LoadConfigTable;

long BoundImport;

long IAT;

long DelayImportDescriptor;

long CLRRuntimeHeader;

long reserved;

} PE_Optional_Header_Plus;

#endif // HEADERS_H_

반응형

'과거의 컴퓨터 공부 > PE Viewer 다시만들기 ' 카테고리의 다른 글

(PEViewer)utils.h  (0) 2015.06.02
(PEViewer) codes.h  (0) 2015.06.01
(PEViewer)Main.c  (0) 2015.05.31
PE viewer 다시 만들어보기  (0) 2015.05.31
,
반응형

특이사항 보다는 안써본함수가 있어서 그거에 대한 내용은 주석에다가 달아두었고 ,

PE 포맷임을 확인하는  signature를 확인하고 IMAGE_FILE_HEADER를 뽑아주고.

magic을 기준으로 PE 32, PE32+(64bit)를 나눈뒤  IMAGE_OPTIONAL_HEADER값들을 뽑아주는 형식으로 진행된다 



#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <string.h>


#include “..\include\headers.h”

#include “..\include\utils.h”

#include “..\include\codes.h”


int main(int argc,char** argv[])

{ //인자값 체크

if(argc <2)

{

printf(“Usage: %s file\n”, argv[0]);

}


const char* filename = argv[1];

FILE* file = fopen(filename, “rb”);

long size = 0;

char* data;


if(!file)

{ //파일포맷이 맞지않을때 오류 

fprintf(stderr, “Failed to open file. \n”);

return EXIT_FAILURE;

}


fseek(file,0,SEEK_END);

// fseek() 함수 레퍼런스 , 파일에서 위치 찾는 함수 

//http://www.tipssoft.com/bulletin/board.php?bo_table=old_bbs&wr_id=298

size = ftell(file); //ftell() : 현재사용하는 파일 포인터의 작업위치 알려줌, 보통 파일크기 알아낼때 사용 

rewind(file); //파일의 읽기/쓰기 위치를 처음으로 다시 초기화 시킴


data = (char*)malloc(size * sizeof(char));


if(data == NULL)

fprintf(stderr, “Failed to allocate memory/ \n”);

}

int bytes_read = fread(data, sizeof(char), size, file);


if(bytes_read < size)

{

perror(“Failed to read file.\n”);

}


if(size <= 133) // 최소한의 PE파일 크기 check

printf(“Not a valid PE file. \n”);

return EXIT_SUCCESS;

}


union

{

char* ptr;

int* num;

}t; 

//union 레퍼런스

//http://forum.falinux.com/zbxe/index.php?document_srl=557139&mid=lecture_tip


t.ptr = &data[60];


if((*t.number + 3 ) >size) //범위check

{

printf(“Not a valid PE file\n”);

return EXIT_SUCCESS;

}


char pe_sig[4] = {data[*t.num], data[*t.num+1],

data[t.num+2], data[*t.num+3]};


union // PE Header 유니온 설정

{

PE_Header* pe_head;

char* data;

}u;


u.data=&data[*t.num];


if(strcmp(pe_sig, “PE”) !=0) //PE signature확인

{

printf(“Not a valid PE file.\n”);

return EXIT_SUCCESS;

}


time_t timestamp = (time_t)u.pe_head->TimeStamp;


printf(“%s:\n\n”, argv[1]);

// information start 

printf(“PE HEADER INFORMATION\n”);

printf(“Machine : %s\n”, read_machine_type(u.pe_head));

printf(“NumberOfSections: %i\n”, u.pe_head->NumberOfSections);

printf(“TimeDateStamp: %s”, ctime(&timestamp));

printf(“PointerToSymbolTable: %x\n”, u.pe_head->PointerToSymbolTable);

printf(“NumberOfSymbols: %i\n”, u.pe_head->NumberOfSymbols);

printf(“SizeOfOptionalHeader: %i\n”, u.pe_head->SizeOfOptionalHeader);

printf(“Characteristics:\n”);

print_characteristics(read_characeteristics(u.pe_head));


if(u.pe_head->SizeOfOptionalHeader >0)

{

printf(“\nPE OPTIONAL HEADER INFORMATION”);


int opt_head_start = *t.num+(24 * sizeof(char));

int opt_head_end = opt_head_start + u.pe_head->SizeOfOptionalHeader;


char magic_str[2] = {data[opt_head_start], data[opt_head_start+1]};


union

{

char* str;

short* magic;

}v;

//magic을 기준으로 PE32 PE64 구분


v.str=magic_str;


if(*v.magic==0x10b)

{

//PE32

printf( “PE32\n”);


union

{

PE_Optional_Header* pe_opt_head;

char* data;

}w; // Optional header 기준


w.data = &data[opt_head_start];

 printf("MajorLinkerVersion: %i\n", w.pe_opt_head->MajorLinkerVersion);

      printf("MinorLinkerVersion: %i\n", w.pe_opt_head->MinorLinkerVersion);

      printf("SizeOfCode: %i\n", w.pe_opt_head->SizeOfCode);

      printf("SizeOfInitializedData: %i\n", w.pe_opt_head->SizeOfInitializedData);

      printf("SizeOfUninitializedData: %i\n", w.pe_opt_head->SizeOfUninitializedData);

      printf("AddressOfEntryPoint: %#x\n", w.pe_opt_head->AddressOfEntryPoint);

      printf("BaseOfCode: %#x\n", w.pe_opt_head->BaseOfCode);

      printf("ImageBase: %#x\n", w.pe_opt_head->ImageBase);

      printf("\n");

      printf("SectionAlignment: %i\n", w.pe_opt_head->SectionAlignment);

      printf("FileAlignment: %i\n", w.pe_opt_head->FileAlignment);

      printf("MajorOperatingSystemVersion: %i\n", w.pe_opt_head->MajorOperatingSystemVersion);

      printf("MinorOperatingSystemVersion: %i\n", w.pe_opt_head->MinorOperatingSystemVersion);

      printf("MajorImageVersion: %i\n", w.pe_opt_head->MajorImageVersion);

      printf("MinorImageVersion: %i\n", w.pe_opt_head->MinorImageVersion);

      printf("MajorSubsystemVersion: %i\n", w.pe_opt_head->MajorSubsystemVersion);

      printf("MinorSubsystemVersion: %i\n", w.pe_opt_head->MinorSubsystemVersion);

      printf("Win32VersionValue: %i\n", w.pe_opt_head->Win32VersionValue);

      printf("SizeOfImage: %i\n", w.pe_opt_head->SizeOfImage);

      printf("SizeOfHeaders: %i\n", w.pe_opt_head->SizeOfHeaders);

      printf("CheckSum: %i\n", w.pe_opt_head->CheckSum);

      printf("Subsystem: %s\n", read_windows_subsystem_pe32(w.pe_opt_head));

      printf("DLLCharacteristics:\n");

      print_dll_characteristics(read_dll_characteristics_pe32(w.pe_opt_head));

      printf("SizeOfStackReserve: %i\n", w.pe_opt_head->SizeOfStackReserve);

      printf("SizeOfStackCommit: %i\n", w.pe_opt_head->SizeOfStackCommit);

      printf("SizeOfHeapReserve: %i\n", w.pe_opt_head->SizeOfHeapReserve);

      printf("LoaderFlags: %i\n", w.pe_opt_head->LoaderFlags);

      printf("NumberOfRvaAndSizes: %i\n", w.pe_opt_head->NumberOfRvaAndSizes);

    }

    else if(*v.magic == 0x20b)

    {

      // PE32+ 64비트 기준

      printf("(PE32+)\n");


      union

      {

        PE_Optional_Header_Plus* pe_opt_head;

        char* data;

      }w; //optional header기준 


      w.data = &data[opt_head_start];

      

      printf("MajorLinkerVersion: %i\n", w.pe_opt_head->MajorLinkerVersion);

      printf("MinorLinkerVersion: %i\n", w.pe_opt_head->MinorLinkerVersion);

      printf("SizeOfCode: %i\n", w.pe_opt_head->SizeOfCode);

      printf("SizeOfInitializedData: %i\n", w.pe_opt_head->SizeOfInitializedData);

      printf("SizeOfUninitializedData: %i\n", w.pe_opt_head->SizeOfUninitializedData);

      printf("AddressOfEntryPoint: %#x\n", w.pe_opt_head->AddressOfEntryPoint);

      printf("BaseOfCode: %#x\n", w.pe_opt_head->BaseOfCode);

      printf("ImageBase: %#x\n", w.pe_opt_head->ImageBase);

      printf("\n");

      printf("SectionAlignment: %i\n", w.pe_opt_head->SectionAlignment);

      printf("FileAlignment: %i\n", w.pe_opt_head->FileAlignment);

      printf("MajorOperatingSystemVersion: %i\n", w.pe_opt_head->MajorOperatingSystemVersion);

      printf("MinorOperatingSystemVersion: %i\n", w.pe_opt_head->MinorOperatingSystemVersion);

      printf("MajorImageVersion: %i\n", w.pe_opt_head->MajorImageVersion);

      printf("MinorImageVersion: %i\n", w.pe_opt_head->MinorImageVersion);

      printf("MajorSubsystemVersion: %i\n", w.pe_opt_head->MajorSubsystemVersion);

      printf("MinorSubsystemVersion: %i\n", w.pe_opt_head->MinorSubsystemVersion);

      printf("Win32VersionValue: %i\n", w.pe_opt_head->Win32VersionValue);

      printf("SizeOfImage: %i\n", w.pe_opt_head->SizeOfImage);

      printf("SizeOfHeaders: %i\n", w.pe_opt_head->SizeOfHeaders);

      printf("CheckSum: %i\n", w.pe_opt_head->CheckSum);

      printf("Subsystem: %s\n", read_windows_subsystem_pe32_plus(w.pe_opt_head));

      printf("DLLCharacteristics:\n");

      print_dll_characteristics(read_dll_characteristics_pe32_plus(w.pe_opt_head));

      printf("SizeOfStackReserve: %i\n", w.pe_opt_head->SizeOfStackReserve);

      printf("SizeOfStackCommit: %i\n", w.pe_opt_head->SizeOfStackCommit);

      printf("SizeOfHeapReserve: %i\n", w.pe_opt_head->SizeOfHeapReserve);

      printf("LoaderFlags: %i\n", w.pe_opt_head->LoaderFlags);

      printf("NumberOfRvaAndSizes: %i\n", w.pe_opt_head->NumberOfRvaAndSizes);

    }


  }


  free(data);

  

  return EXIT_SUCCESS;

}

반응형

'과거의 컴퓨터 공부 > PE Viewer 다시만들기 ' 카테고리의 다른 글

(PEViewer)utils.h  (0) 2015.06.02
(PEViewer) codes.h  (0) 2015.06.01
(PEViewer)headers.h  (0) 2015.06.01
PE viewer 다시 만들어보기  (0) 2015.05.31
,
반응형

다시 만들어봐야 될일이 생기기도 했고, 까먹은게 많아서 다시 공부할겸 만들어보기로 하였다

우선은 

https://github.com/hetra/PEek

깃헙에서 좋은 소스를 찾앗고,

Copyright (c) 2015 Jack McPherson


Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:


The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.


THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

막써도 된다고 라이센스에 써잇으니 마구 주물러 볼 예정이다.. 지금 VM에 VS가 안깔려있어서 세팅중 

+)2015.06.01

소스코드를 정리하면서  보기 쉽게 정리해봣다 .. 보는 사람이 도움 되길 바라며 ..

예전에 따라 만들어본  깃헙에서 가져온 코드는  main에다가 난잡하게 코드를 짜놔서 이해하기 어려웠는데 

이번에 복습하면서 본 코드(지금 설명하고 있는 코드)는 기능별로 잘 나눠줘서 확실히 이해가 잘된다

자세한 소스들은 다음포스팅 부터 소스별 코드를 첨부한다 


반응형

'과거의 컴퓨터 공부 > PE Viewer 다시만들기 ' 카테고리의 다른 글

(PEViewer)utils.h  (0) 2015.06.02
(PEViewer) codes.h  (0) 2015.06.01
(PEViewer)headers.h  (0) 2015.06.01
(PEViewer)Main.c  (0) 2015.05.31
,
반응형


EXPLOIT STUDY Using CTF.pptx

출처는 명확히 밝혀주세요 


반응형

'과거의 컴퓨터 공부 > 발표했던 자료들' 카테고리의 다른 글

2015.03.08 KSIA 세미나 발표  (0) 2015.03.11
IT4U 세미나  (0) 2014.10.29
영남권 KUCIS 세미나  (0) 2014.10.29
,
반응형

*풀다가 노트북을 맥북으로 바꾸는 바람에 중간에 터미널모양이 약간 바뀌엇다 양해바람..  

GOT, PLT ,_dl_runtime_resolve가 어떤식으로 맞물려있는지 알게해준 굉장히 고마운 문제다.. 

ctf풀기 시작하면서 정말 많이 배우는것 같다..

#다른사람들이랑 환경이 달라서그런가.. 바이너리에서 더해주는 값이 다르다.. 

 

□ description

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

ssh guest@58.229.183.15 / ExtremelyDangerousGuest

ssh guest@58.229.183.14 / ExtremelyDangerousGuest



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


 □ number of solvers : 32

 □ breakthrough by

    1 : CodeRed (02/22 10:40)

    2 : euronop (02/22 11:37)

    3 : stratumauhuur (02/23 02:00)







# memory가 랜덤이지만, 로컬에서 익스플로잇 하는 문제이기 떄문에 ulimit -s unlimited 명령을 이용해 메모리 랜덤을 비활성화 해주고 진행하였다.


컴퓨터랑 4목을 두는 게임이다(근데 재미없음 ..) 



+)우왕 ㅋ 이김ㅋ (이기는 방법알아내는게 생각보다 좀 오래걸렷다 ...)



졋을때와 이겻을때의 output값


이겻을떄 몇초가 걸렷는지 output 값으로 내보내주는데, 이 부분에 뭔가 있을것 같아 IDA로 이부분을 찾아서 

Hex-ray로 디컴파일을 해보았다

[Decompile]



게임에서 0초 이내에 이기면,4byte의 값을 임의의 주소에 입력받는다는 것을 알 수 있다.


근데 밑의 부분에 


 HIWORD(v2) = HIWORD(argv1);

 LOWORD(v2) = 0;

 if ( v2 != 0x8040000 )                  // stack

        {

          if ( (argv1 & 0xF0000000) != 0xB0000000 )

            *(_DWORD *)argv1 = v3;



4byte 입력 받는 값이 stack의 주소를 갖지않고(stack의 주소라는 것은 아래의 그림을 통해 확인 할 수있

다,0x8040000),0xB0000000(바이너리) 의 주소를 갖지 않는다면, 

입력받은 값이 첫번쨰 인자의 값이 된다(4byte)


뿐만아니라, 이문제는 프로그램의 마지막 부분에서 처음으로 exit()함수를 사용한다. 

즉, 우리가 dl_runtime_resolve부분을 조작할 수  있다는 것을 의미한다.

그러면  exit()을 한번 따라 들어가보도록 하자 

[exit@plt 를 처음으로 호출하는 부분 ]



[exit@plt]



[exit@got]:  exit()가 _dl_runtime_resolve에 의해서 got상에 올라가기 전 상태,

~ exit@plt 부분에서 got호출 하는 주소의 바로다음 주소를 가르킨다.


+)반대로 got상에  exit()이 올라간 상태 



[exit@plt+11 에서 jmp한 부분] 

 objdump로 분석해본 결과 이부분의 심볼을 확인할 수 있엇는데 printf@plt-0x10 이라고 적혀있다.. 

이부분이 무슨기능을 하는지는 추후에 좀더 알아보고 추가하도록 하겟다.


+)plt 에서 _dl_runtime_resolve로 넘어가기전에 exit@plt -> .plt 영역 -> dl_runtime_resolve



[_dl_runtime_resolve]400139b0




[_dl_fixup] 0x4000db40 ~ 0x4000dc61




[_dl_fixup_  에서 반환 값을 결정해주는 부분]


eax :40082000


gdb-peda$ x/x $edi+0x4

0x4008e828: 0x00016d60

즉,  eax의 값 (0x40081000)에 [edi+0x4]의 값이 더해져서 반환값으로 사용된다.

따라서 0x40081000를 덮어씌우고, 0x00016d60을 더한곳으로 eip를 변조할 수 있음을 알아내었다.

랜덤스택으로인해서 그냥 환경변수를 때려넣어주게 되면 맞추기 힘들다 .. 

그래서 http://blackcon.tistory.com/90 를 참고해서 spraying 기법으로 환경변수를 뿌려서 이용해 보려 한다.




그러면 이제 분석을 모두 마쳣으니 본격적으로 쉘을 따보자





[payload]

[4목 이기는 로직 ] [환경변수 주소 ] ;cat| ./4stone  [rwx영역의 주소]

0x40081000 

 

(perl -e 'print "\xd","hh","\xd","h","\xd","\xd","hhhh","\xd","h","\xd","hhh","\xd","hh","\xdbf743089"';cat)|./4stone 40081000







+)32bit의 elf fileformat 이다

처음 파일 실행할때 64 bit 환경에서 실행을 했엇는데, 64bit 에서 gcc-multilib 없이 32 비트 프로그램을 실행시키면 그런파일이 없다고 뜬다..multilib 를 설치해주던가 32 bit 환경에서 실행하도록하자





반응형
,