security 183

Basic RCE L16~L20

L16. Serial 값 구하기 (Name = "CodeEngn" 일 때) 콘솔 프로그램이네. "Enter your Name:" 출력, 이름 입력 시 "Enter your Password:" 출력, 틀리면 "Wrong password!" IDA 디컴파일 기능을 이용해 분석해보면 if(v12==v13) 결과에 따라 성공/실패 분기가 나뉜다 * v12는 password로 입력받은 값이 그대로 들어가고 (cin 으로 &v12에 바로 저장) * v13은 name으로 입력받은 값 가지고 조작해서 생성함 (v14) bp 걸어놓고 스택 상태 확인해보자 int v12 = [ebp-0x40] // password로 입력한 숫자가 들어가네 ("1234" => 4D2) unsigned int v13 = [ebp-0x3C] ..

Basic RCE L11~L15

L11. OEP + Stolen Bytes HxD로 까서보니 UPX 패킹되어있네 언패킹해보았더니 EP=4071F0 에서 OEP=401000으로 바뀌었다 언패킹 된 파일을 실행해보았더니 문자열 깨진 MessageBox 뜨더라 - Stolen byte 때문? 11.exe를 ollydbg로 열어보니 0x401000부터 0x40100B까지가 NOP로 채워져있음. Stolen byte automatic unpack 옵션 체크해제하고 다시 연 다음 POPAD로 간다. PUSH 명령어 3개 발견가능 => stolen bytes: 6A0068002040006812204000 L12. Key 값 + 코드 패치 (RVA to RAW) Detect It Easy에 던져보니 패킹 안 된 순수한 파일 serial key 입력하..

BASIC RCE L06~L10

L06. 패킹된 파일의 OEP + Crackme Serial 평범한 Crackme 문제. Serial 값을 입력하고 check serial 버튼 누르면 됨 틀리면 "Wrong serial!!!!" Messagebox 뜸 HxD로 열어보니 섹션이 UPX0, UPX1, .rsrc 이렇게 3개. 전형적인 UPX packed file upx.exe -d 06.exe 해서 unpack 한다 (file size 26112 에서 159744로 증가!) 1) EP 찾기 EP는 unpacked된 파일을 PE View로 확인해보면 Image Base + RVA of EP = 00401360 (ollydbg로 열어봐도 마찬가지) 혹은 UPX packed file은 PUSHAD - POPAD - OEP JMP 한다는 아이디어..

BASIC RCE L01~L05

L01. HDD to CD ROM 실행시켜보니 "Make me think your HD is a CD-Rom" 문자열 가진 MessageBox 등장 확인 누르니 "Nah... This is not a CD-ROM Drive!" 문자열 가진 MessageBox 등장 코드 분석해보니 kernel32!GetDriveTypeA("c:\") 호출 후 리턴값을 받아서 EAX는 2 감소시키고 (API 호출 후 리턴값: 일반 실행 시 3) ESI는 3 증가시킨 후 (API 호출 직후 64bit Win10 PC에선 401000[Entry Point]로 세팅. 32bit Win7 PC에선 0) CMP EAX, ESI 해서 같으면 성공, 다르면 실패 - CMP 시 ESI = 0x3이다, EAX=0x1이다 => 성공 Mess..

SEH [Structured Exception Handling]

OS의 예외 처리 방식 1. 일반 실행의 경우 - 프로세스에게 처리를 맡김. - SEH가 구현되어있다면 예외 처리 후 진행, 없다면 OS 기본 예외 처리기 동작시켜 프로세스 종료 2. 디버깅 실행의 경우 - 우선적으로 디버거에게 예외를 넘김 - 디버거는 디버기 내부에서 발생하는 모든 예외/에러 상황을 처리해야함 - 예외 직접 수정하거나, 예외를 디버기에게 넘겨서 디버기의 SEH가 처리하도록 (Shift + F7/F8/F9) Window OS 예외 종류 - EXCEPTION_ACCESS_VIOLATION (0xC0000005) - EXCEPTION_ARRAY_BOUNDS_EXCEEDED (0xC000008C) - EXCEPTION_BREAKPOINT (0x80000003) // ex) software bp..

TEB & PEB 정리

TEB (Thread Environment Block) - 프로세스에서 실행되는 스레드에 대한 정보를 담고 있는 구조체 [offset 0x0: NtTib] - _NT_TIB 구조체 존재 - 0x0 offset의 ExceptionList = SEH (윈도우 OS 예외처리 메커니즘)의 시작주소 - 0x18 offset의 Self = _NT_TIB 구조체의 셀프 포인터 = TEB 구조체의 포인터 typedef struct _NT_TIB { struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; PVOID StackBase; PVOID StackLimit; PVOID SubSystemTib; union { PVOID FiberData; DWORD Version; }; P..

TLS 콜백 함수

TLS (Thread Local Storage) - 스레드별로 가지는 독립된(고유한) 데이터 저장 공간 - 각각의 스레드는 고유한 스택을 갖기 때문에 스택 변수(지역 변수)는 스레드 별로 고유하다. 그러나 정적 변수와 전역 변수의 경우에는 프로세스 내의 모든 스레드에 의해서 공유된다 (= 공유 메모리 영역에 놓인다) - 정적(static) 변수, 전역(global) 변수를 각각의 스레드에게 독립적으로 만들어 주고 싶을 때 사용한다 - 같은 문장(context)을 실행하고 있지만 실제로는 스레드 별로 다른 주소 공간을 상대로 작업하게 됨 TLS 콜백 함수 - 프로세스의 스레드가 생성/종료될 때마다 자동으로 호출되는 콜백 함수 - 쓰레드 전용으로 쓰이는 'TLS'와 특정 이벤트에 의해 호출되는 'Callba..

CreateRemoteThread()를 이용한 DLL Injetcion의 한계

Windows 7부터 적용된 세션 관리 정책 - 시스템 프로세스들과 서비스 프로세스들이 실행되는 시스템 세션(Session ID=0)과 로그온 사용자의 세션(Session ID>=1)을 분리 - CreateRemoteThread() API를 이용한 DLL 인젝션 기법은 1) Session 1의 사용자 세션에서 실행되는 프로세스 대상으로는 잘 동작하지만 2) Session 0의 시스템 세션에서 실행되는 프로세스 대상으로는 동작하지 x 해결 방법 - Kernel32!CreateRemoteThread() API 내부에서 remote thread를 생성할 때 ZwCreateThreadEx()를 이용해 suspend 모드로 생성하는데, 만약 리모트 프로세스가 Session 0이라면 (CreateSuspended ..

ASLR 제거

ASLR - PE 파일이 "메모리에 로딩될 때" 로딩 시작 주소 값을 랜덤하게 바꾼다 * RVA of EP=0x12AE이고, EXE 파일의 ImageBase는 0x00400000이므로 EP=4012AE이다. * ASLR이 적용되면 "빌드 시마다" EXE 파일의 ImageBase 값이 달라진다 - 해당 프로세스의 스택/힙 시작 주소도 "실행될 때마다" 랜덤하게 바뀐다 * ASLR_no.exe의 경우 스택 주소 일정. ASLR.exe의 경우 실행 시마다 스택 주소 달라짐 ASLR 세팅 in visual C++ ASLR 적용 / 미적용 차이 1) .reloc 섹션 존재여부, IMAGE_FILE_HEADER.Characteristics - ASLR_no.exe에는 .reloc 섹션이 존재하지 않으므로 - IMA..

API 코드 패치를 이용한 API hooking - notepad.exe 프로세스 은폐하기 (2)

글로벌 API 후킹 1. 현재 실행중인 모든 프로세스에 대해 API 후킹 - (1)에서 ZwQuerySystemInformation API 이용 2. 앞으로 실행될 모든 프로세스에 대해 API 후킹 - CreateProcess API 이용 2-1. CreateProcessA / CreateProcessW 모두 후킹해야하는 번거로움, 자식 프로세스가 후킹되지 않은 채로 실행될 가능성존재 - ZwResumeThread API 이용 HideProc2.exe 코드 구현 - HideProc.exe랑 동일, 은폐 프로세스 이름이 "notepad.exe"로 하드코딩 - "stealth2.dll"은 모든 프로세스가 인식할 수 있는 경로인 %system32%(C:\Windows\System32)에 위치함. 따라서 dll..