본문 바로가기

함수 보호되어 있는 글입니다. 더보기
PHP 연산자 및 구문 보호되어 있는 글입니다. 더보기
PHP를 이용한 웹 서버 구축하기 보호되어 있는 글입니다. 더보기
CRC2 보호되어 있는 글입니다. 더보기
CRC1 보호되어 있는 글입니다. 더보기
[HDCON 2016] crackme 보호되어 있는 글입니다. 더보기
[HDCON 2016] runme 보호되어 있는 글입니다. 더보기
[HDCON 2016] winme 보호되어 있는 글입니다. 더보기
[HDCON 2016] remote 보호되어 있는 글입니다. 더보기
[HDCON 2016] recme 보호되어 있는 글입니다. 더보기
[Whitehat 2016] REVS 보호되어 있는 글입니다. 더보기
[Pwnable] Shellsploit 보호되어 있는 글입니다. 더보기
Active X Bug hunting 보호되어 있는 글입니다. 더보기
명령어, 레지스터의 구성 명령어, 레지스터의 구성 컴퓨터를 사용하는데 가장 많이 들어본 이야기가 "컴퓨터는 0, 1로만 이해한다." 입니다. 하지만 사람이 0과 1로 보기에는 무리가 있고, 이것을 쉽게 보기위해서 어셈블리어, C언어 등 다양한 언어들이 나왔습니다. 리버싱을 하게되면 어셈블리어를 보게 되는데, 이 어셈블리어는 0과 1로 이루어진 값을 일대일 대응시켜 만들어진 언어입니다. 이러한 어셈블리어들은 어떻게 만들어졌는지 알아보도록 하겠습니다. 현재 많은 컴퓨터들이 64비트로 실행되고 있습니다. 물론 32비트도 많이 있습니다. 하지만 하드웨어사양도 높아지고 처리해야하는 데이터 양도 많이져서 64비트를 많이 사용하고 있습니다.앞서 어셈블리어는 0과 1로 이루어진 값을 일대일 대응시켜서 만들어졌다고 했는데 이번 포스팅에서는 16.. 더보기
Polymorphic Polymorphic Polymorphic은 다형성이라는 뜻을 가지고 있습니다. 말 그대로 다양한 형태를 가지고 있다는 뜻이죠. PTR이 붙어있어서 포인터라고 생각할 수 있지만 포인터값 기반의 연산을 위해서 정의된 자료형입니다. UINT를 사용해서 컴파일을 하게되면 32비트 자료형이 사용됩니다. 만약 64비트로 사용을 할 때에는 UINT64를 이용해야 합니다. 그렇다면 번거롭게 32비트 64비트에 맞춰 코드를 수정하면 매우 귀찮은 일입니다. 위 소스코드 처럼 64비트일 때와 32비트일 때를 구분해서 처리하도록 하면 됩니다. 하지만 이 또한 코드가 깔끔하지 않습니다. 그래서 사용하는 것이 UINT_PTR 입니다. 더보기
x86 & x64 x86 & x64 과거에는 x86 즉, 32비트 운영체제가 많이 사용되어왔습니다. 하지만 현재 대부분의 데스크톱이나 노트북들이 모두 64비트를 지원하고 그만큼 하드웨어 성능 또한 향상되었습니다. 보통 x86과 x64의 차이가 뭐냐?라는 질문에는 x86에서는 메모리를 4G까지 사용할 수 있다. x64에서는 4G이상 사용할 수 있다. 이정도 입니다. 그저 하드웨어적으로 사양을 높이기 위해서 사용하는 것일까요??? 32비트와 64비트의 가장 큰 차이점은 한번에 처리를 할 수 있는 데이터의 크기입니다. 32비트에서는 2의 32제곱 즉, 4GB까지 사용가능하며 64비트는 2의 64제곱으로 16TB까지 사용이 가능합니다.하지만 하드웨어적으로 64비트를 사용하더라고 메인보드에 따라 사용할 수 있는 메모리가 제한되어 .. 더보기
SBCS, MBCS, WBCS SBCS, MBCS, WBCS 이번에는 SBCS, MBCS, WBCS에 대해서 알아보도록 하겠습니다. SBCS, MBCS, WBCS는 Character Sets라고 불립니다. 간단히 말하자면 약속된 문자의 표현 방법이라고 할 수 있습니다. Single Byte Character Set Single Byte Character Set (이하 SBCS)은 문자를 표현하는데 1바이트만 사용하는 방식을 말합니다. 평소 사용되는 문자가 ASCII 코드가 있는데 ASCII 코드가 대표적인 SBCS에 해당합니다. 단순히 ASCII 코드로만 이루어진 문자를 출력하는 것이므로 예제코드는 올리지 않겠습니다. Multi Byte Character Set Multi Byte Character Set (이하 MBCS)은 다양한 .. 더보기
[Reversing, Pwnable] radare2 보호되어 있는 글입니다. 더보기
Obfuscation (난독화) Obfuscation (난독화) 위 소스코드를 보면 IsDebuggerPresent()를 이용해서 현재 프로그램이 디버깅 중인지 아닌지 판단을 할 수 있습니다. IDA를 이용해 해당 부분을 살펴보도록 하겠습니다. 위 사진을 보면 CALL IsDebuggerPresent가 나타납니다. 그리고 디버깅 중이라면 "디버깅 중"이 출력되고 디버깅 중이 아니라면 "정상 실행 중"이 출력이 됩니다. 여기서 IDA를 이용해서 정적분석을 진행하면 IsDebuggerPresent()가 있다는 것을 알게되므로 이 부분을 나타나지 않도록 해야합니다. 해당 부분이 IsDebuggerPresent() 부분입니다. 해당 부분에서 EB를 넣어 코드를 수정해주면 정적분석시에 IsDebuggerPresent()인지 알 수 없게되어 분석.. 더보기
[DEFCON 2016] baby-re 보호되어 있는 글입니다. 더보기
컴퓨터 구조 컴퓨터 구조 컴퓨터 구조에 대해서 알아보도록 하겠습니다. 기능CPU Control Processing Unit (이하 CPU)는 대부분 알고계시는 것처럼 연산을하고 프로그램을 실행하는 곳을 말합니다.CPU에는 ALU, Contorl Unit, Register Set, Bus InterFace가 존재합니다. Arithmetic Logic Unit Arithmetic Logic Unit(이하 ALU)는 간단히 말하자면 연산을 하는 곳입니다. 산술연산, AND, OR과 같은 논리연산을 합니다. Control Unit Control Unit은 ALU가 연산하기 전에 어떤 연산을 하는지 해독을 하는 부분입니다. 가령 어떤 프로그램이 CPU에 전달되어서 실행이 되어야 한다면 컴퓨터는 0, 1과 같은 2진수로만 이해.. 더보기
Native API Native API Native API는 윈도우 NT 시스템의 실질적인 인터페이스입니다. Win32 API는 Native API에 대한 상위 계층일 뿝이고 NT 커널은 GUI와 아무런 관련이 없기 때문에 Native API는 그래픽관련 서비스를 포함하지 않습니다. 메모리 관리자, I/O 시스템, 객체 관리자, 프로세스와 스레드 등에 직접 접근할 수 있는 인터페이스를 제공하므로 윈도우 커널에 대한 가장 직접적인 인터페이스 입니다. Native API는 NTDLL.DLL과 NTOSKRNL.EXE에서 익스포트된 함수들의 집합입니다. Navtive API는 Nt나 Zw로 시작하는 API가 존재하는데 Nt로 시작하는 API는 API를 실질적으로 구현하는 함수이고, Zw는 시스템 콜 메커니즘이 수행되는 함수 입니다.. 더보기
C++ 분석 C++ 분석 C++는 어셈블리어로 보게 되면 난해한 상태로 분석을 해야합니다. 어느 부분이 클래스인지 어느 부분이 구조체인지 쉽게 파악할 수 없습니다. 하나씩 분석해보도록 하겠습니다. 123456789101112131415161718192021222324252627282930313233343536373839404142#include #include #include class Employee{public: int number; char name[128]; long pay; void ShowData(); void Test();}; void Employee::ShowData(){ printf("Number: %d\n", number); printf("Name: %s\n", name); printf("pay: .. 더보기
Debug Blocker Debug Blocker Debug Blocker 기법은 자기 자신을 디버깅 모드로 실행하는 기법입니다. 부모 프로세스와 자식 프로세스간의 관계가 디버거 - 디버기 관계로 이루어져 있기 때문에 디버기인 자식프로세스에 중요 코드가 존재한다면 자식 프로세스를 디버깅해야 합니다.하지만 디버거 - 디버기 관계가 안티 디버깅 역할을 하기 때문에 디버깅하기가 어렵습니다. 중점사항 1. 부모 - 자식 관계 디버거 - 디버기 관계는 부모 - 자식 프로세스 관계이기 때문에 Self Creation 기법에서와 같이 디버깅을 하기 어려워 집니다. 2. 디버기 프로세스는 다른 디버거에서 디버깅 불가 Windows 운영체제에서 여러 디버거로 동시에 같은 프로세스를 디버깅 할 수 없습니다. 3. 디버거 프로세스를 종료하면 디버기.. 더보기
PE Image Switching PE Image Switching PE Image Switching은 다른 프로세스를 실행한 후에 가상 메모리의 PE Image를 자신의 것과 바꾸는 것을 말합니다. PE 구조를 공부했을때 아래와 같은 그림을 봤었습니다. 일반적으로 PE 파일은 file Alignment와 Section Alignment가 다르고 각 섹션의 Raw Data Size 와 Virtual Size가 다르기 때문에 PE Image 사에 형태가 달라집니다. PE Image Switching A.exe 를 SUSPEND 모드로 실행한 후 B.exe의 PE Image를 Mapping 시켜 A.exe 프로세스 메모리 공간에서 실행하는 기법입니다. PE Image를 변경하면 프로세스는 A.exe 이지만 메모리 공간에 매핑된 PE Imag.. 더보기
Self Creation Debugging Self Creation Debugging Self Creation Debugging은 실행 중 자기 자신을 자식 프로세스로 생성시키는 프로그램을 디버깅하는 것을 말합니다.같은 프로그램이지만 부모 프로세스로 실행될 때와 자식 프로세스로 실행될 때 다르게 동작합니다. 동작원리 Create Child Process (SUSPEND mode) 부모 프로세스가 실행되면 main()이 호출되는데 자식 프로세스를 SUSPEND 모드로 생성합니다. SUSPEND 모드로 생성되면 Import DLL은 로딩 되지만 Main Thread가 멈춘상태가 됩니다.main thread는 프로세스가 생성될 때 기본적으로 생성되는 thread 인데, EP 코드를 실행시키는 역할을 담당하고 있습니다. SUSPEND 모드로 실행된 프로.. 더보기
Service Debugging Service Debugging Service Process 동작 원리 서비스 프로그램은 Service Control Manager(이하 SCM)에서 관리됩니다. 서비스 프로그램이 실행 되려면 Service Controller가 필요합니다.Service Controller가 서비스 제어 요청을 하면 SCM이 서비스 프로그램에 제어 명령을 전달하고 리턴 값을 받습니다. Service Controller 서비스 컨트롤러는 제어판 - 서비스를 실행하면 나타납니다. 또는 실행 - services.msc 를 실행해도 됩니다. 위 Service Controller에 들어가게 되면 시스템에 설치된 서비스 목록들이 나타나게 됩니다. 서비스 시작 과정 1. Service Controller에서 StartService().. 더보기
Advanced Anti Debugging Advanced Anti Debugging PE Protector에서 주로 사용되는 기법의 공통된 특징은 리버싱을 하는 사람을 힘들게 합니다.가비지 코드, 조건 분기문, 루프문, 암호화/복호화 코드 그리고 Call_Tree에 빠져서 정작 분석하고 싶은 코드에 접근 조차 못하게 합니다. Garbage Code 말 그대로 쓰레기 코드 입니다. 아무 의미없는 어셈블리어들을 이용해서 분석을 어렵게 합니다. 아니면 단순히 JMP 0x00000000과 같은 명령을 통해서 간단히 구현이 가능한 것을0x00000000을 여러 연산을 통해서 만들어 내기도 합니다. Breaking Code Alignment 디스 어셈블리 코드를 깨트리는 것을 말합니다. 예를 들어 JMP 0x12345678 명령어가 있는데 해당 주소가 정.. 더보기
Anti Debugging - Dynamic Anti Debugging - Dynamic Dynamic Anti Debugging은 프로그램의 코드를 트레이싱 하지 못하도록 지속적으로 방해하는 기법입니다.내부 코드와 데이터를 리버싱으로부터 감추고 보호하는 것을 말합니다. PE Protector에서 많이 사용되고 원본 프로그램의 핵심 알고리즘을 보호하기 위해서 사용됩니다.OEP로 가지 못하도록 방해합니다. 예외 안티 디버깅에서 예외를 이용하는 방법이 많이 나옵니다. 정상적으로 실행된 프로세스에서 예외가 발생하면 SEH 메커니즘에 의해 OS에서 예외를 받아서 프로세스에 등록된 SEH를 호출합니다.하지만 디버깅을 하는 경우 프로세스에서 예외가 발생하면 디버거에서 예외를 담당합니다. 이러한 방식을 이용해서 정상 실행되는 경우와 디버깅 상태에서 실행되는 경.. 더보기
Anti Debugging - Static Anti Debugging - Static 프로세스에서 자신이 디버깅 당하는지 여부를 파악하는 기법입니다. 만약 디버깅 중이라고 판단되면 일반 실행과 다른 코드를 실행하는 것입니다.디버거를 탐지하거나 디버깅 환경을 탐지하거나 디버거를 강제 분리 시키는 방법이 있습니다. 대부분의 Static Anti Debugging은 OS에 의존하고 있어서 XP에서는 되는데 7에서는 안되고 7에서는 되는데 10에서는 안되는 경우가 있습니다. Process Envritonment Block (PEB) PEB에서 BeingDebugged, Ldr, ProcessHeap, NtGlobalFlag 멤버를 확인해야 합니다. BeingDebugged 멤버는 디버깅 여부를 표시하는 Flag로 사용됩니다. Ldr, ProcessHea.. 더보기