REVERSE ENGINEERING HeXA 1st
CPU Register, Assembly Language 실전 문제 CPU Register, Assembly Language ‘Ollydbg’ 사용법 ‘Reverse Engineering’ 이란?
REVERSE ENGINEERING Reverse Engineering 이란? - 거꾸로 분석하는 것 (소프트웨어를 ‘역’으로 분석) Reversing 이란? - Reverse Engineering 의 줄임말 :D
REVERSE ENGINEERING 소스 코드 (Source Code) 컴파일 (Compile) 디컴파일 (Decompile) 어셈블리어 (Assembly) 디어셈블 (Deassemble) 어셈블 (Assemble) 기계어 (Binary / 0,1)
REVERSE ENGINEERING 정적분석 – 파일을 실행시키지 않고 분석 (파일의 종류, 크기, 헤더내용 등) //논리적 오류 수정에 적합 동적분석 – 파일을 실행시켜서 분석 (Registry, Network 등 모니터링/디버깅) // “Ollydbg”
‘Ollydbg’ 사용법
어셈블리 코트, 레지스터 상태, Dump 창(해당 주소를 16진법으로 보여줌), 스택
CPU구조 ALU(Arithmetic Logic Unit) CU(Control Unit) Register 산술연산, 논리연산 수행 CU(Control Unit) 명령어 해석, 장치 동작 지시 Register 기억장치 Bus Interface 데이터 전달
CPU 구조
Register란 중앙처리장치(CPU)에 있는 소규모 기억장치 내부Bus가 Register와 ALU, CU와 연결되어 있다 주기억장치(RAM) 보다 저장하는 속도가 빠르다
Register종류 범용 레지스터(general register) 명령 포인터(command pointer) 카운터, 데이터주소저장, 연산등의 목적 명령 포인터(command pointer) CU에서 액세스할 기억장치장소 저장 세그먼트 레지스터(segment register) 코드, 데이터, 스택의 주소 저장 플래그 레지스터(flag register) 연산 결과 상태를 표시
범용 레지스터 EAX(Extended Accumulator Register) EBX(Extended Base Register) ECX(Extended Counter Register) EDX(Extended Data Register) ESI(Extended Source Index) EDI(Extended Destination Index) ESP(Extended Stack Pointer) EBP(Extended Base Pointer) 16bit 에서는 앞에 E(Extended)를 빼면 됨 Ex. AX, SI, SP ….
범용 레지스터 EAX(or AX) : 산술연산에 사용, 함수의 리턴값 저장 EBX(or BX) : ESI, EDI와 결합하여 간접번지 지정 ECX(or CX) : 반복카운터로 사용 EDX(or DX) : EAX와 같이 쓰며 부호 확장 명령에 사용 ESI(or SI) : 데이터 복사시 Source의 주소 저장 EDI(or DI) : 데이터 복사시 Destination의 주소 ESP(or SP) : 스택의 TOP의 주소저장 EBP(or BP) : 스택의 BOTTOM의 주소저장
명령 포인터 EIP(Extended Instruction Pointer) 다음 명령어의 주소값을 저장한다
세그먼트 레지스터 CS(Code Segment) DS(Data Segment) SS(Stack Segment) 코드 영역을 가리키는 레지스터 DS(Data Segment) 데이터 영역을 가리키는 레지스터 SS(Stack Segment) 스택 영역을 가리키는 레지스터 세그먼트 레지스터는 16비트
플래그 레지스터 CF(Carry Flag) ZF(Zero Flag) OF(Overflow Flag) SF(sign Flag) 부호가 없는 연산시 결과가 용량보다 크면 세트(1) ZF(Zero Flag) 연산 결과가 0일때 세트(1), 0이 아니면 해제(0) OF(Overflow Flag) 부호 있는 연산시 결과가 용량보다 클면 세트(1) SF(sign Flag) 연산 결과가 음수일때 세트(1), 양수 이면 해제(0) DF(Direction Flag) 문자열 처리시 처리 방향에 따라 세트
어셈블리어란 저급언어의 하나로 기계와 1:1로 대응하는 언어로 사람이 이해하기 쉽게 변형한 언어
주요명령어 MOV destination, source ADD operand1, operand2 SUB operand1, operand2 Operand1 -= operand2 MUL operand1 EAX(or AX)레지스터값 *= opreand1 IMUL destination, operand1, operand2 Destination = operand1 * operand2 SHL/SHR operand1, operand2 Operand1 <</>> operand2
주요명령어 AND operand1, operand2 OR operand1, opearand2 각 비트가 모두 1일때 1, 아니면 0 OR operand1, opearand2 각 비트가 모두 0일때 0, 아니면 1 XOR operand1, operand2 각 비트가 서로 다를때 1, 아니면 0 CMP operand1, operand2 (Operand1 - operand2) == 0 결과는 0
주요명령어 CALL operand1 RET JMP operand1 PUSH operand1 PUSHAD/PUSHFD 호출되었던 부분으로 리턴 JMP operand1 Operand1 지점으로 이동 PUSH operand1 스택에 값을 넣는다 PUSHAD/PUSHFD 범용레지스터/플래그 레지스터 값을 스택에 PUSH한다 POP operand1 스택에 값을 가져온다 POPAD/POPFD 범용레지스터/플래그 레지스터 값을 스택에서 POP한다
Jump를 사용한 CrackMe1
Winapi를 사용한 INC, DEC 풀이 API INC : 1 증가 DEC : 1 감소 Application Programming Interface 운영체제가 응용 프로그램을 위해 제공하는 함수의 집합 INC : 1 증가 DEC : 1 감소
Return code/value drive_unknown 0 drive_no_root_dir 1 drive_removable 2 drive_fixed 3 drive_remote 4 drive_cdrom 5 drive_ramdisk 6
EAX ESI 3 0 3 1 2 1 2 2 2 3 1 3 DEC 2개를 NOP 처리
감사합니다