목록Windows/Reversing (7)
둘둘리둘둘리둘둘리둘둘리둘둘리둘
nt!_TEB+0x000 NtTib : _NT_TIB+0x01c EnvironmentPointer : Ptr32 Void+0x020 ClientId : _CLIENT_ID+0x028 ActiveRpcHandle : Ptr32 Void+0x02c ThreadLocalStoragePointer : Ptr32 Void+0x030 ProcessEnvironmentBlock : Ptr32 _PEB+0x034 LastErrorValue : Uint4B+0x038 CountOfOwnedCriticalSections : Uint4B+0x03c CsrClientThread : Ptr32 Void+0x040 Win32ThreadInfo : Ptr32 Void+0x044 User32Reserved : [26] Uint4B+..
@디버깅 이벤트(Debugging Events) Event Code Event Code Value Union u Value 0x01 EXCEPTION_DEBUG_EVENT u.Exception 0x02 CREATE_THREAD_DEBUG_EVENT u.CreateThread 0x03 CREATE_PROCESS_DEBUG_EVENT u.CreateProcessInfo 0x04 EXIT_THREAD_DEBUG_EVENT u.ExitThread 0x05 EXIT_PROCESS_DEBUG_EVENT u.ExitProcess 0x06 LOAD_DLL_DEBUG_EVENT u.LoadDll 0x07 UNLOAD_DLL_DEBUG_EVENT u.UnloadDll 0x08 OUTPUT_DEBUG_STRING_EVENT..
@메모리 브레이크 포인트(Memory Breakpoints) 메모리 브레이크 포인트는 실제로 전혀 브레이크포인트가 아니다. 메모리 브레이크 포인트를 설정할때 디버거는 메모리의 영역(또는 page)의 권한을 변경한다. 메모리 페이지(Memory page)는 OS에서 처리하는 메모리의 가장 작은 단위이다. 메모리 페이지가 할당되면 할당된 메모리 페이지는 특정 접근권한이 세트된다. 메모리 페이지 권한(Memory page permissions) - Page execution실행가능권한, 만약 프로세스가 페이지에 읽거나 쓰려고하면 Access violation을 발생시킨다. - Page read프로세스가 페이지에서 읽어오기만 가능하게한다. 읽거나 실행시키려하면 Access violation. - Page wri..
@하드웨어 브레이크 포인트(Hardware Breakpoints) Debuggee 프로세스를 수정할 수 없을경우(Software breakpoints를 사용할수 없을경우) instruction의 수정 없이 사용할 수 있는 하드웨어 브레이크 포인트가 유용하다. 하드웨어 브레이크 포인트는 debug registers 라는 특수한 레지스터에 CPU레벨에서 셋트되며, 하드웨어 브레이크 포인트를 셋트하고 관리하는 debug registers는 DR0에서 DR7까지가 있다. DR0~DR3 : 브레이크 포인트 주소를 위해 예약됨DR4, DR5 : ReservedDR6 : Status register, 하드웨어 브레이크 포인트에의해 디버깅 이벤트 발생시 셋팅됨DR7 : 다른 브레이크 포인트의 상태를 저장 (하드웨어 브..
cdecl - C에서 default로 사용- Caller가 스택 정리(ex: ADD ESP,8)- 가변 갯수의 Parameter전달 가능 stdcall- Win32API에서 사용 -> 호환성을 위해- Callee가 스택 정리(ex: RETN 8)- 코드 크기 줄어듬 fastcall- stdcall과 동일하나 parameter 전달시 ECX,EDX 레지스터를 이용- parameter가 2개이상일경우 스택이용- 메모리(스택)이 아닌 레지스터(CPU)를 이용하여 빠른속도- ECX, EDX 레지스터 필요시 백업 -> 코드 크기 늘어남
root@Kali-Linux:/home/flag# ltrace ./nos__libc_start_main(0x40050c, 1, 0x7fffd6006a28, 0x400540, 0x400530 printf("hello") = 5hello+++ exited (status 0) +++ __libc_start_main에 첫번째 인자가 main함수의 주소 root@Kali-Linux:/home/flag# objdump -f ./nos ./nos: file format elf64-x86-64architecture: i386:x86-64, flags 0x00000112:EXEC_P, HAS_SYMS, D_PAGEDstart address 0x0000000000400400 root@Kali-Linux:/home/flag..
SUB - 빼기, 연산결과 0-> ZF 1 IMUL - 부호 있는 곱셈, 부호 비트를 제외하고 연산 후 부호를 붙임 CMP - op1,2를 비교, 같으면 ZF = 1 TEST ; Logical Compare - 두 피연산자를 AND연산하여 결과가 0이면 ZF가 1로 세트 됨, 보통 값이 있는지 없는지를 확인할때 사용ex) if( a ) REP ; Repeat - ECX가 0이 될때까지 반복, 시작시 ECX-1 REPNE ; Repeat until not equal - ZF가 1로 세트되거나 ECX가 0이 될때까지 반복, 시작시 ECX-1, 보통 SCAS와 같이 쓰임 SCAS ; Scan string - AL 또는 AX 또는 EAX와 EDI가 가리키는 메모리 내용 비교후 같으면 ZF = 1, 비교한만큼 E..