x86 아키텍처
• 데이터 타입: 어셈블리 기본
• 주소 표기법: 리틀 엔디안 / a b c d -> d c b a
• 레지스터: 8개의 범용 레지스터, EIP, EFLAGS
• 호출 규약: cdecl, stdcall, fastcall
• 명령어 세트: 가변 길이 명령어 형식을 사용
• 피연산자: 레지스터, 메모리 주소, 주소값, 숫자
• 기본 문법: AT&T(원투) 또는 Intel (투원) / 리눅스 AT&T 사용 윈도우 Intel 방식
ex> AT&T = add a,b > b=a+b // Intel 방식 = add a,b > a=a+b
레지스터
• 8개의 범용 레지스터 + EIP(32비트)
• EFLAGS 레지스터(32비트)
• 세그먼트 레지스터(16비트)
• EAX - 산술 연산에 사용, 함수 리턴값 저장
• EBX - 베이스, 특정 메모리를 가리키는 포인터
• ECX - 카운터 코드에 사용
• EDX - 데이터 레지스터 (곱셈, 나눗셈 )
• ESI - 문자열 연산의 출발지 포인터
• EDI - 문자열 연산의 목적지 포인터
• ESP - 스택 포인터
• EBP - 스택 프레임 베이스 포인터. 스택의 기준 주소를 저장
• EIP - 다음 실행할 명령어를 가리키는 포인터
EFLAGS 레지스터
• 상태 플래그
• 방향 플래그
• 시스템 & IOPL 플래그
• CF - Carry
• PF - Parity
• AF - Adjust
• ZF - Zero
• SF - Sign
• OF - Overflow
명령어 세트
명령어 유형 | 의 미 | 대표 명령어 세트 |
데이터 이동 | src에서 dst로 이동 | mov, lea, les, push, pop, pushad, popad |
산술 | 정수의 산술 연산 | add, adc, sub, sbb, mul, imul, div, idev, cmp, inc, dec |
부동 소수점 | 부동 소수점 산술 연산 | fadd, fsub, fmul, div, cmp |
논리 | 비트 논리 연산 | and, or, xor, not, shl/sal, shr, sar, ror, rol |
제어 이동 | 제어 흐름의 이동 | jmp, jcc, call, ret, int, into |
문자열 | 문자열의 비교, 이동 | movs, stos, sca, outs, rep, repz, repnz, repne |
I/O | 입력과 출력 | in, out |
변환 | 데이터 타입 변환 | movzx, movsx, cbw, cdq, bswap |
기타 | 플래그 조작, 특권 모드 처리 | clc, stc, cmc, std, cl, sti |
• 어셈블러: 어셈블리 언어 compiler(assemble)
• 대표적인 어셈블러 • GAS(GNU 어셈블러) - AT&T 방식으로 무료이며 크로스 플랫폼을 지원. GNU Project에서 제작
• MASM(Microsoft Macro Assembler) - Intel 방식으로 비주얼 스튜디오 2008부터 기본 탑재. 매크로 지원. 크로스 플랫폼 미지원
• NASM(Netwide Assembler) - 80x86 플랫폼 용으로 크로스 플랫폼을 지원. MASM과 유사한 점 많음(Intel 방식)
'Reverse engineering > 리버싱 분석 강의 정리' 카테고리의 다른 글
리버싱#1 - gdb 명령어 사용하는 방법! (0) | 2021.03.01 |
---|---|
리버싱#1 NASM(넷와이드 어셈블러) 사용법 (0) | 2021.02.25 |
리버싱#1 어셈블리 기본!! (0) | 2021.02.19 |
리버싱#1 아키텍처 이해하기 (시스템 동작 원리) (0) | 2021.02.19 |
리버싱#1 아키텍처 이해하기! 컴퓨터 구조, CPU 아키텍처 (0) | 2021.02.17 |
댓글