본문 바로가기

Anti Debugging Anti Debugging 안티 디버깅은 디버거를 방해하는 것으로 특정 OS 버전에서만 동작하는 경우가 있고, 디버거의 종류에 따라서 적용되는 안티 디버깅 기법도 조금씩 다릅니다.안티 디버깅은 Static과 Dynamic 으로 나뉩니다. 안티 디버깅 분류 Static 안티 디버깅 Static 기법은 디버거를 탐지하여 프로그램이 정상적으로 실행되지 못하도록 하는 거입니다. 디버거에 프로그램을 올렸을 때 실행이 안되게 하는 것입니다. Dynamic 안티 디버깅 Dynamic 기법은 디버거 트레이싱을 방해해서 원본 프로그램의 코드와 데이터를 확인 할 수 없게 만드는 것입니다. 더보기
IA32 Instruction IA32 Insturction 추후 공부할 예정. 더보기
Structured Exception Handler (SEH) Structured Exception Handler (SEH) Structured Exception Handler (이하 SEH)는 Windows에서 제공하는 예외 처리입니다. __try, __except, __finally 키워드로 구현할 수 있습니다.C++에서 제공하는 tyr, catch와는 다릅니다. SEH가 먼저 만들어졌습니다. SEH 프로그램을 실행시키면 위 그림처럼 Hello :)를 출력해줍니다. 정상적으로 실행이 되는것 같지만 사실 내부에서 예외가 발생하여 처리가 되어서 정상실행 된 것입니다. OllyDBG를 이용해서 seh.exe를 실행시켜보면 아래와 같은 위치에서 Access violaton이 발생합니다. EAX의 값을 가져오지 못하고 있습니다. 밑에 상태창에서 Access violati.. 더보기
Process Environment Block (PEB) Process Environment Block (PEB) Process Environmnet Block (이하 PEB)는 프로세스 정보를 담고 있는 구조체 입니다. PEB는 TEB.ProcessEnvrionmentBlock 멤버가 PEB 구조체의 주소입니다. TEB 구조체는 FS Segment 셀렉터가 가리키는 세그먼트 메모리의 시작 주소에 위치하고 ProcessEnvrionmentBlock 멤버는 TEB 구조체의 시작부터 30 Offset 만큼 떨어져 있습니다. FS:[30] = TEB.ProcessEnvironmentBlock = address of PEB 어셈코드로 하면 mov eax, DWORD PTR FS:[30]이거나 mov eax, DWORD PTR FS:[18] mov eax, DWORD .. 더보기
Thread Environment Block (TEB) Thread Environment Block (TEB) Thread Environment Block (이하 TEB) 는 프로세스에서 실행되는 thread에 대한 정보를 담고 있는 구조체 입니다.thread 별로 TEB 구조체가 하나씩 할당되고, OS 종류별로 조금씩 다릅니다. VS2013에서 찾은 TEB 구조체 입니다. 핵심원리에 나와있는 구조체와는 조금 다르네요. WinDBG를 이용해서 확인해 보도록 하겠습니다. 아무 파일이나 넣어서 dt_TEB를 하면 TEB에 대한 정보가 나타납니다. Windows 10 x64환경에서 진행되었습니다. 0:000> dt_TEBntdll!_TEB +0x000 NtTib : _NT_TIB +0x038 EnvironmentPointer : Ptr64 Void +0x040 C.. 더보기
Thread Local Storage CallBack (TLS) Thread Local Storage CallBack (TLS) Thread Local Storage (TLS)는 Thread 별로 독립된 데이터 저장공간 입니다. Thrad 내에서 프로세서의 전역 데이터나 정적 데이터를 마치 지역 데이터 처럼 독립적으로 취급하고 싶을 때 사용합니다. 마찬가지로 Windows 10 환경에서 시도해 보겠습니다. OllyDBG에 붙여서 실행을 했음에도 불구하고 Hello :)가 출력이 되었습니다. 원래는 Debugger Detected!가 출력이 되어야 합니다. 그래서 혹시나 OllyDBG Plugin 때문에 그러지 않을까 싶어서 Plugin을 모두 제거하고 실행을 했지만 마찬가지 였습니다. 그래서 reversecore.com에서 직접 실습예제를 다운 받아서 실행해 봤더니 .. 더보기
DLL Injection in kernel 6 DLL Injection in kernel 6 kernel version 6 이후부터 CreateRemoteThread()가 사실상 사용이 불가능한데, 이 API를 대신해서 ZwCreateThreadEx() API를 사용하면 Injection이 된다고 합니다. Windows 10 x64 환경에서 소스코드를 작성하여 실행해 보도록 하겠습니다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410.. 더보기
Session in Kernel 6 Session in Kernel 6 최근 Windows 7, 10을 많이 사용할 겁니다. Winodws Vista 이후부터 Session이 6.0 으로 바뀌고, ASLR 기능이 적용되어 보안이 강화되었습니다. DLL Injection을 할 때 CreateRemoteThread()을 사용하여 Injection을 시도했었습니다. 하지만 Kernel 6.0 프로세스들에는 CreateRemoteThread()가 사용되지 않습니다. Session Session이라는 것은 로그온 사용자 환경을 말합니다. OS는 여러 사용자에게 로그온을 허가하고 각 로그온에 대해서 독립된 사용자 환경을 제공합니다. Session을 확인하는 방법은 Process Explorer에서 View 항목을 선택하면 현재 실행되고 있는 프로세스.. 더보기
Address Space Layout Randomization (ASLR) Address Space Layout Randomization (ASLR) Address Space Layout Randomization (이하 ASLR)은 Windows Vista 부터 적용된 기술입니다. (오래전에 XP SP3부터 적용되었다고 들었는데...) Windows Kernel Version Windows 2000 5.0 Windows XP 5.1 Windows Server 2003 5.2 Windows Vista 6.0 Windows Server 2008 6.0 Windows 2008 R2 6.1 Windows 7 6.1 Windows 8 6.2 Windows 8.1 6.3 Windows 10 6.4 ASLR 기능은 Kernel 6.0 이후 부터 지원되는 기능이라고 합니다. ASLR 시스템 .. 더보기
WinDBG명령어와 분석방법 WinDBG WinDBG 명령어와 실제 분석 방법에 대해서 알아보도록 하겠습니다. 명령어 분석 Reversing을 처음 시작할 때 많이 하는 abexcm1.exe를 가지고 설명하도록 하겠습니다. Windbg로 abexcm1.exe를 실행시키면 아래와 같이 int 3에 걸린 상태로 멈추게 됩니다. abexcm1이 로딩된 주소를 확인해 보니 image00400000으로 되어있습니다. EP 코드 EP 주소를 구합니다. !dh 명령어를 통해서 구할 수 있습니다. OllyDBG에서 Memory map에서 imagebase + sizeofimage를 확인하는 것과 같습니다.main을 찾기 위한거죠. Address of entry point를 확인해 보니 1000입니다. 주소 이동 그렇다면 실제 실행되는 주소로 이동.. 더보기
64비트에서 달라진 점 64비트에서 달라진 점 대부분 32비트 환경에서 리버싱을 해오면서 64비트는 단순히 주소만 확장되어 사용되고, 레지스터가 조금 달라졌다. 이정도 수준만 알고 리버싱을 했었습니다.책을 보면서 몰랐던 부분들도 많이 있어서 정리해 두면 좋겠다 싶어 작성합니다. 64bit CPU intel에서 64bit CPU인 IA-64를 만들면서 64bit에 강력한 성능을 뽑아냈습니다. 하지만 기존의 32bit와는 호환이 되지 못해서 사실상 사람들이 많이 사용하지 못했죠.그러던 중 AMD에서 32bit와 호환이 되는 AMD64를 만들게 되었고 사람들이 많이 사용했습니다. 이것을 intel이 라이센스를 사들여서 intel64로 바꾸게 됩니다. Win32 API 64bit 프로그램을 만들 때 기존의 win32 API를 그대로 .. 더보기
API Hooking - API Code Patch, Global Hooking API Hooking - API Code Patch, Global Hooking API Code Patch, Global Hooking을 이용한 Stealth Process(Rootkit) 기법에 대해서 알아보도록 하겠습니다. API Code Patch 원리 Code Patch 방식은 실제 API 코드 시작 5바이트 값을 JMP XXXX 명령어로 패치하는 방식입니다.Hooking된 API가 호출되면 JMP XXXX 명령어가 실행되어 후킹 함수로 제어가 넘어옵니다.Code Patch는 프로세스에서 사용되는 어떤 API라도 후킹을 할 수 있습니다. 제한사항으로는 API 코드의 길이가 최소 5바이트 보다 커야 한다는 것.하지만 API의 코드 크기는 5바이트 보다 크기 때문에 사실상 제한이 없다. ※ 프로세스의.. 더보기
API Hooking - IAT Hooking API Hooking - IAT Hooking Windows의 계산기에 DLL 파일을 삽입하여 IAT의 user32.SetWindowsTextW() API를 후킹하는 것을 해보도록 하겠습니다. PEViewer를 이용하여 IAT를 확인합니다. 대부분 많이 사용되는 PEView 프로그램은 64bit를 지원하지 않기 때문에 64비트 프로그램을 분석할 수가 없습니다.그래서 64비트를 지원하는 PEBrowse를 이용합니다. PEView 프로그램을 이용해서 IAT를 확인해 보면 windows 10의 계산기 프로그램에서는 SetWindowTextW() API가 나타나지 않았습니다. 그래서 혹시나 해서 디버거를 이용해서 확인해보니 user32.dll이 로딩이 되었고, SetWindowTextW가 존재했습니다. Setw.. 더보기
API Hooking - Debug Technique API Hooking - Debug Technique Debug 기법을 이용한 실습을 해보도록 하겠습니다. 핵심원리에 나와있는 notedpad.exe WriteFile()을 해볼텐데, Windows 10 x64 notepad.exe를 이용하여 해보도록 하겠습니다. 먼저 디버거 동작원리와 디버그 이벤트에 대해서 알아보도록 하겠습니다. 디버거 동작원리 프로세스가 디버거에 붙어서 실행이 되면 OS에서는 프로세스에서 디버그 이벤트가 발생할 때 해당 프로세스 실행을 정지시키고 디버거에게 전달합니다.그러면 디버거는 해당 이벤트에 대해서 처리를 한 후에 프로세스 실행을 다시 시작합니다. 일반적인 예외도 디버그 이벤트에 해당하고, 해당 프로세스가 디버깅 중이 아니라면 디버그 이벤트는 예외처리되거나 OS의 예외 처리 루.. 더보기
API Hooking API Hooking 실행 흐름을 변경하고, 원래 동작하는 기능을 다른 기능으로 바꿔 동작하도록 만드는 방법입니다. API라는 것은 Windows를 사용함에 있어서, 애플리케이션이 시스템 자원에 직접 접근할 수 있는 방법이 없습니다. 그래서 MS에서 제공하는 Win32 API를 이용합니다.쉽게 말하자면 API 또한 함수라고 생각하면 되는데, 이미 만들어져 있는 함수라고 생각하면 됩니다. 모든 프로세스에는 기본적으로 kernel32.dll 이 로딩되고, kernel32.dll은 ntdll.dll를 로딩합니다. 예외적으로 smss.exe는 kernel32.dll을 로딩하지 않습니다. API Hooking의 과정을 살펴보면 아래와 같습니다. 정상적인 호출일 경우 Process에서 CreateFile()을 호출.. 더보기
Code Injection Code Injection Code Injection은 상대방 프로세스에 독립 실행 코드를 삽인한 후 실행하는 기법을 말한다. CreateRemoteThread() API를 이용하여 원격 쓰렏 형태로 실행하기 때문에 Thread Injection이라고도 한다. Code Injection을 사용하는 이유는 메모리를 적게 차지하고, DLL Injection과 다르게 흔적을 찾기가 어렵습니다. Code Injection을 할 때 몇가지 알아 두어야 할 점이 있습니다. - 프로그램 빌드 시 Release 모드- 최적화 옵션 /0d- Data Execution Prevention (DEP) 해제 ※ Release 모드로 하는 이유는 Debug 모드로 빌드를 하게되면 코드 중간에 에러를 잡는 코드가 삽입되어 정확한.. 더보기
DLL Load Using PE Patch DLL Load Using PE Patch DLL Injection을 하면서 프로그램 내에 강제로 DLL을 삽입을 시켰습니다. 이번에는 PE 패치를 통해서 DLL을 실행시켜보도록 하겠습니다. 리버싱 핵심원리에 나와있는 TextView 프로그램과 다릅니다. 버전이 업데이트된 파일같습니다. 그래도 한번 따라서 해보도록 하겠습니다. IDT (Import Directory Table) 확인 IDT를 확인해 보면 여러가지 dll이 나타납니다. COMCTL32.dll SHLWAPI.dll KERNEL32.dll USER32.dll GDI32.dll comdlg32.dll ADVAPI32.dll SHELL32.dll ole32.dll MSVBR70.dll 핵심원리에서는 4개의 dll만 들어가 있는데 제가 받은 프로그.. 더보기
[SECUINSIDE 2016] CYKOR_00001 보호되어 있는 글입니다. 더보기
[Pwnable] CGC 환경구축 보호되어 있는 글입니다. 더보기
[SECUINSIDE 2016] noted 보호되어 있는 글입니다. 더보기
DLL Ejection DLL Ejection DLL Ejection은 프로그램이 실행되는데 DLL파일이 함께 사용되는데, 해당 프로그램에서 사용되는 DLL을 빼내는 것을 말합니다.다만, 사용자가 강제로 넣은 것만 뺄 수 있습니다. Injection에서는 LoadLibrary()를 호출하도록 했지만, Ejection에서는 FreeLibrary()를 호출하도록 합니다. Ejction도 마찬가지로 CreateRemoteThread()를 사용합니다. 다만 인자로 넘겨주는 값이 달라집니다. lpStartAddress에 FreeLibrary() 주소를 넣어주고, lpParameter에 Ejection할 DLL의 Handle을 넣어줍니다. 처음 Injection을 합니다. k3y6reak.dll 파일이 정상적으로 Injection된 것을.. 더보기
DLL Injection DLL Injection DLL Injection은 프로그램이 실행되는데 DLL 파일이 함께 사용되는데, 이 프로그램에 DLL 파일을 삽입하여 사용하는 것을 말한다. * DLL (Dynamic Linked Library)DLL은 동적 라이브러리라고 불리며, DLL이 로딩되면 DllMain()이 실행된다. DLL Injection이 활용되는 곳은 후킹, 기능 개선, 버그 패치 등등 여러 일을 할 수 있다. CreateRemoteThread() CreateRemoteThread()는 Jeffrey Ritcher에 의해서 공개되었다고 합니다. hProcess : Thread가 생성될 타겟 프로세스, Thread 생성에 성공하기 위해서는 이 Handle에 대해 PROCESS_VM_OPERATION, PROCES.. 더보기
brain fuck 보호되어 있는 글입니다. 더보기
pwntool 설치 보호되어 있는 글입니다. 더보기
md5 calculator 보호되어 있는 글입니다. 더보기
otp 보호되어 있는 글입니다. 더보기
alloca 보호되어 있는 글입니다. 더보기
ascii_easy 보호되어 있는 글입니다. 더보기
Bypass Canary Bypass Canary 개념 BOF가 발생할 수 있는 환경이지만 buffer를 모두 채운 뒤에 다음 4바이트가 Canary로 채워져 있어 해당 값이 변경이 될 때 에러를 출력하면서 프로그램이 종료되는데, 이 Canary를 유추해서 우회를 하는 방법을 말한다. 설명 1. Brute Force buffer를 모두 채운 후 다음 4바이트가 Canary로 채워져 있는데 1바이트를 넘어가도록 buffer를 채운다.그러면 Canary 영역에 1바이트가 침범하여 값이 다를 경우 에러를 출력하는데 이때 이 1바이트를 0x00 ~ 0xFF(256)까지 모두 넣어서 뜨지 않는 경우를 찾아낸다. 이렇게 4바이트를 모두 찾아낸다. 2. recv, strncpy recv와 strncpy 함수는 문자열을 입력받을 시 NULL이.. 더보기
simple login 보호되어 있는 글입니다. 더보기