글

라벨이 Reversing인 게시물 표시

확인해야 할 API

확인해야 할 API 제품키 문자열 비교 구문 (Visual Basic) - __vbaVarTstEq - __vbaVarTstNe - __vbaVarCmpEq - __vbaStrCmp - __vbaStrComp - __vbaStrCompVar ​ DialogBoxes (Visual C++) - DialogBoxes - GetDlgItem - GetDlgItemInt - GetDlgItemTextA - GetWindowTextA - GetWindowWord ​ MessageBoxes (Visual C++) - MessageBeep - MessageBoxA - MessageBoxExA - SendMessageA - SendDlgItemMessageA ​ Registry Access (Visual C++) - RegCreateKeyA - RegDeleteKeyA - RegQueryValueA - RegQueryValueExA - RegCloseKeyA - RegOpenKeyA ​ Read/Write File (Visual C++) - ReadFile - WriteFile - CreateFileA ​ Read from INI file (Visual C++) - GetPrivateProfileStringA - GetPrivateProfileIntA - WritePrivateProfileStringA ​ Read data (Visual C++) - LoadStringA - lstrcmpA - MultiByteToWideChar - WideCharToMultiByte - wsprintfA ​ Time data (Visual C++) - GetFileTime - GetLocalTime - GetSystemTime - GetSystemTimeAsFileTime - SetTimer - SystemTimeToFileTime ​ Creating a Nag window (Visual C++) - CreateWindowExA - ShowWindow - UpdateW...

EAT(Export Address Table)

이미지
EAT(Export Address Table)에 대해서 알아보겠습니다. ​ EAT(Export Address Table)는 PE 파일의 함수를 외부에서 호출할 수 있도록 만든 테이블입니다. EAT의 주소는 DataDirectory[0] IMAGE_DIRECTORY_ENTRY_EXPORT VA에 저장되어 있습니다. ​ EAT 구조는 winnt.h에 _IMAGE_EXPORT_DIRECTORY에 정의되어 있습니다. 여기서 중요한 것은 'DWORD Name', 'DWORD Base', 'DWORD NumberOfFunctions', 'DWORD NumberOfNames', 'DWORD AddressOfFunctions', 'DWORD AddressOfNames', 'DWORD AddressOfNameOrdinals'입니다. ​ ​ Name 값은 dll 이름이 저장된 주소가 저장되어 있습니다.(File Offset 계산 필요 - dll 이름을 변경하여도 원래 이름을 확인 가능) Base 값은 함수 Ordinal의 시작 번호입니다. NumberOfFunctions 값은 모든 Export 함수의 개수입니다. NumberOfNames 값은 이름으로 Export 되는 함수의 개수입니다. Ordinal로 Export 되는 함수는 포함되지 않습니다.(NumberOfFunctions 값보다 작거나 같습니다) AddressOfFunctions 값은 모든 Export 함수의 실제 주소 배열의 시작 주소입니다. AddressOfNames 값은 Export 함수의 이름이 저장되어 있는 배열의 시작 주소입니다. AddressOfNameOrdinals 값은 이름으로 Export 되는 함수의 Ordinal 배열의 시작 주소입니다. ​ ​ 제가 만든 PE Viewer로 예를 들겠습니다. User32.dll을 분석해보았습니다. Name 값입니다. 0x9a7de USER3...

PE Header(NT Header)

이미지
PE Header(NT Header)에 대해서 알아보겠습니다. ​ PE Header(NT Header)는 winnt.h에 _IMAGE_NT_HEADERS로 정의되어 있습니다. Signature 값은 PE00입니다. FileHeader는 winnt.h에 _IMAGE_FILE_HEADER로 정의되어 있습니다. OptionalHeader는 winnt.h에 _IMAGE_OPTIONAL_HEADER로 정의되어 있습니다. ​ FileHeader를 보겠습니다. 여기서 중요한 것은 'WORD Machine'과 'WORD NumberOfSections', 'WORD SizeOfOptionalHeader', 'WORD Characteristics'입니다. ​ Machine 값은 CPU를 나타냅니다. NumberOfSections 값은 전체 Section의 개수를 나타냅니다. SizeOfOptionalHeader 값은 OptionalHedaer의 크기를 나타냅니다. Characteristics 값은 파일 속성을 나타냅니다. ​ ​ Machine은 winnt.h에 정의되어 있습니다. SizeOfOptionalHeader 값이 'E0'면 32 bit, 'F0'면 64 bit입니다. Characteristics 값은 winnt.h에 정의되어 있습니다. Bit OR 형식으로 예를 들어, 0x8002면 0x8000과 0x0002가 선택된 상태입니다. ​ ​ OptionalHeader를 보겠습니다. winnt.h에 _IMAGE_OPTIONAL_HEDAER로 정의되어 있습니다.(64 비트는 _IMAGE_OPTIONAL_HEADER64를 보셔야 합니다.) 여기서 중요한 것은 'WORD Magic', 'DWORD SizeOfCode', 'DWORD SizeOfInitializedData', 'DWORD...

DOS Header

이미지
DOS Header에 대해서 알아보겠습니다. ​ DOS Header는 winnt.h에 _IMAGE_DOS_HEADER로 정의되어 있습니다. PE 파일 구조에서 처음 64 바이트를 차지합니다. ​ 여기서 중요한 부분은 WORD e_magic 부분과 LONG e_lfanew 부분입니다. e_magic의 값은 'MZ'이고, e_lfanew의 값은 PE header(NT header)의 시작 주소를 나타냅니다. ​ 끝. 카테고리: Reversing

Signature filed

PE header의 Signature field 값에 따른 파일 형식을 알아보겠습니다. ​ PE: Win32 executable file format. NE: 16-bit Windows New Executable file. LE: Windows 3.x virtual device driver(VxD). LX: OS/2 2.0. 끝. 카테고리: Reversing

PE(Portable Executable) 파일

이미지
PE 파일에 대해서 알아보겠습니다. ​ PE 파일은 윈도우 운영체제에서 실행 가능한 파일을 말합니다. '.acm', '.ax', '.cpl', '.dll', '.drv', '.efi', '.exe', '.mui', '.ocx', '.scr', '.sys', '.tsp' 등이 있습니다. ​ ​ 파일 내부를 보게 되면, 대부분 'MZ'와 'This program cannot be run in DOS mode'라는 글자가 나타납니다. 그리고 아래에 'PE'라는 글자가 있습니다. Section은 9 가지가 있습니다. .text, .bss, .rdata, .data, .rsrc, .edata, .idata, .pdata, .debug Executable Code Section: .text Data Section: .data, .rdata, .bss Export Data Section: .edata Import Data Section: .idata Debug Information Section: .debug 그리고 실행 시, 물리 주소에서 빈 공간을 뽑아 가상주소를 만듭니다. 이때, VA와 RVA로 나뉩니다. VA는 가상 주소의 절대값이고, RVA는 가상 주소의 상대값입니다. ​ OS는 Page Table을 만들어, 물리 주소와 가상 주소를 관리합니다. Page Table을 만들면, 각 섹션이 독립적일 수 있고, 섹션이 깨끗한 Page에서 시작할 수 있습니다. 그리고, 섹션이 작동하지 않을 때에는 HDD에 임시 저장을 할 수 있어, RAM의 한계를 늘려줍니다. File Offset 구하는 법은 다음과 같습니다. File Offset = RVA - VirtualAddress + PointerToRawData입니다. 시작 주소가 ...

DLL(Dynamic Linked Library)

DLL(Dynamic Linked Library)에 대해서 알아보겠습니다.​ DLL은 코드에 함수를 집어넣는 것이 아닌, '.dll' 확장자로 함수를 저장하여 프로그램에서 불러오도록 만든 파일 형식입니다. ​ DLL에는 내부용 함수(Internal function)와 외부용 함수(exported function)가 있습니다. 내부용 함수는 DLL 내부에서만 사용하는 함수입니다. 외부용 함수는 DLL 외부에서 호출이 가능한 함수입니다. ​ 보통 GetProcAddress API로 함수 주소를 알아냅니다. ​ 사용이 끝나면 메모리에서 해제되는 Explicit Linking 방법과 프로그램이 종료될 때 메모리에서 해제되는 Implicit Linking 방법이 있습니다. 끝. ​ 카테고리: Reversing

리버싱 Lenas Reversing for Newbies 10

이미지
사용 버전; x32dbg Mar 10 2019 ​ 10번 문제를 풀어보겠습니다. 문제는 여기서 다운로드할 수 있습니다. https://tuts4you.com/download/category/17// 'Tut.RevereseMe1.exe'를 실행해 봅시다. 참고로 실행을 위해선 msvbvm50.dll 파일이 필요합니다. 구글에서 다운로드하시면 될 거예요. Nag Screen이 나옵니다. '잔소리를 없애고, 올바른 등록키를 찾아라'가 리버싱 목표인가 봅니다. '확인'을 누릅니다. 해당 창이 나옵니다. 'Register me!'를 누르면, 아래의 창이 나옵니다. 'Nag?'를 누르면, Nag Screen이 나옵니다. 자, 리버싱을 시작해봅시다. '모든 모듈' - '모듈간 호출'을 눌러줍니다. ​ ​ ​ 필터에 'box'를 적어서, MessageBox 관련 함수를 모두 찾습니다. 'F2'로 Break Point를 설정합니다. Entry Point를 찾습니다. Entry Point의 위의 구조는 VB 언어로 만들어진 프로그램입니다. 'F9'를 눌러 프로그램을 실행합니다. '740AEE13' 주소에서 Break Point가 걸립니다. 'F8'로 실행하면, 메시지 박스가 나옵니다. 잘 찾은 것 같습니다. '740AEE13' 주소의 'CALL DWORD PTR [<&MessageBoxIndirectA>]가 끝난 다음에 EAX가 1로 설정된 것이 보입니다....

함수 호출 규약(cdecl, stdcall)

함수 호출 규약에 대해서 알아보겠습니다. ​ 함수 호출 규약은 크게 두 가지가 있습니다. 함수를 호출 한 쪽에서 스택을 정리하는 cdecl 방식과 함수 내부에서 스택을 정리하는 stdcall 방식입니다. ​ cdecl 방식의 경우, 보통 C 언어에서 사용합니다. CALL 함수 뒤에, 'ADD ESP, 4' 식으로 스택을 정리합니다. ​ stdcall 방식의 경우, 보통 Win32 API에서 사용합니다. 함수를 빠져나가기 전에 'RETN 4' 식으로 스택을 정리합니다. 'RETN 4'는 'ESP + 4'라고 보셔도 됩니다. ​ ​ 끝. ​ 카테고리: Reversing

리버싱 abex crackme 2 시리얼 부분

이미지
사용 프로그램: x32dbg Mar 10 2019 abex crackme 2에서 시리얼(serial) 부분을 리버싱해봅시다. 이름에는 'Jaehwa'를 입력하고 'Check'를 눌러줍니다. ​ ​ 'Check'시 Serial 키를 비교하고 메시지 박스를 내보내므로, 먼저 'Check' 버튼의 이벤트 핸들러를 찾습니다. 일단 그냥 'Check'를 눌렀을 때 나오는 메시지 박스 문구를 찾습니다. 'Please enter at least 4 chars as name!' 여기서 위로 쭉쭉 올라갑니다. 올라가다 보면, NOP이 나오고, 그다음 스택이 생성되는 곳이 있습니다. 여기가 'Check' 버튼의 핸들러입니다. 여기에 breakpoint를 걸어주고, 'Check' 버튼을 누르면 EIP가 저기에서 멈춥니다. ​ ​ 쭉쭉 진행하다 보면, 어느 순간 주석문에 우리가 입력한 'Jaehwa'가 나타납니다. 여기서 'ebp-0x88'에 우리가 입력한 'Jaehwa'가 들어간 것을 확인할 수 있습니다. 쭉 내려가봅시다. 내려가다 보면, 반복되는 구간이 있습니다. '00403197'에서 '004032A0'구간입니다. 문자열을 하나씩 불러오면서 암호화하는 구간으로 예상됩니다. ​ ​ '004031F7'주소를 지나면, EAX에 'J'가 들어간 것으로 보아, 'CALL <&rtcAnsiValueBstr>'에서 문자를 읽어오는 것으로 예상됩니다. 반복문 한 바퀴를 돌면, 'EBP-94'에 'AE'가 들어간 것을 볼 수 있습니다. ​ ​ ​ 한 바퀴를 또 돌면, 'EBP-94'에 AEC5가 들어간 것을 볼 수 있습니다. ...