-
소프트웨어 역공학 3주자여러가지 공부 2022. 4. 18. 17:25
레지스터 (Registers)
- 빠른 연산을 위해 사용되는 레지스터 - 수행문잭, 제어정보, 데이터 임시 저장
- 레지스터는 CPU에 내장된 저장 공간으로, CPU 아키텍처마다 다름
REGISTERS IN X86
범용 레지스터 (General Purpose Registers)
- 범용 레지스터는 필요할 때마다 메모리 주소 또는 데이터에 사용되는 CPU에 있는 추가 레지스터입니다.예를 들어, 중단이 있을 때 현재 레지스터 내용을 저장합니다.
- EAX, EBX, ECX, EDX
포인터 (Pointers)
- 포인터란 어떠한 값을 저장하는 게 아닌 어떠한 값의 주소(Address)를 저장하는 것입니다.
- ESI, EDI
스택 포인터 (Stack Pointers)
- 스택 포인터는 스택에 마지막 프로그램 요청의 주소를 저장하는 작은 레지스터입니다. 스택은 위에서 아래로 데이터를 저장하는 특수 버퍼입니다. 새로운 요청이 들어오면 이전 요청을 "푸시"합니다.
- ESP: 스택의 맨 위를 가리킨다.
- EBP: 현재 스택 프레임의 기준점을 가리킨다.
특수 레지스터 (Special Registers)
- 컴파일러에 의해 생성된 저장 영역의 이름을 지정하는 예약어입니다.
- EIP: 지시 포인터
- EFLAGS: 프로세서의 상태를 유지
EAX (Extended Accumulator Register)
- EAX 레지스터는 산술 (덧셈, 곱셈, 나눗셈 등등), 논리 연산을 수행할 때 사용되며 함수의 반환 값이 이 레지스터에 저장
- 32Bit로 구성되어 있으며, EAX를 반으로 쪼개면 AX(16Bit)가 됨
- 또다시 AX를 반으로 쪼개면 AH, AL로 나뉘고 각자 8Bit를 가지게 됨
EBX (Extended Base Register)
- EBX레지스터는 메모리 주소를 저장하기 위한 용도로 사용
- 다른 레지스터들과 마찬가지로 32Bit로 구성되어 있으며, EBX를 반으로 쪼개면 BX(16Bit)가 됨
- 그 BX를 또 반으로 쪼개면 BH, BL로 나뉘고 각자 8Bit를 가지게 됨
ECX (Extended Counter Register)
- ECX레지스터는 반복 명령어 (For, While) 명령어 사용 시 반복 카운터로 사용되는 레지스터
- 즉, ECX레지스터에 반복할 횟수를 지정하고 반복 작업을 수행할 때 사용
EDX (Exteded Date Register)
- EDX레지스터는 EAX레지스터와 같이 쓰이고 부호 확장 명령 등에 쓰이고 큰 수의 곱셈 또는 나눗셈 등의 연산이 이루어질 때 EDX 레지스터가 사용
- 32Bit로 구성되어 있고 EDX를 반으로 쪼개면 DX(16Bit)가 됨
- DX를 또 쪼개면 DH(4Bit), DL(4Bit)가 됨
ESI (Extended Source Index)/ EDI (Destination Index)
- ESI는 데이터를 조작하거나, 복사할 때 데이터의 주소가 저장
- EDI는 복사할 때 목적지의 주소가 저장
ESP (Extended Stack Pointer)/ EBP (Extended Base Pointer)
- ESP는 Stack의 끝 지점 주소를 가리키고, EBP는 Stack의 첫 시작 주소를 가리킴
함수 (Function)
함수란?
- 소프트웨어에서 특정 동작을 수행하는 코드 덩어리 - Printf도 일종의 함수
- 함수는 크게 '시스템 정의 함수'와 '사용자 정의 함수'로 나눌 수 있음
- 시스템 정의 함수는 운영체제에서 요구하는 형식에 맞추어 사용해야 함
- 어셈블리 입장에서 볼 때, 함수 이름과 매개변수, 해당 함수를 제공하는 라이브러리 파일이 필요
함수 호출 규약 (Calling Convention)
- 호출자가 변수를 피호출자에게 넘기고, 피호출자의 작업 결과를 반환하는 방법을 정의한 규약
명령어 집합 (Instruction Sets)
- 실질적인 어셈블리 언어
- 아키텍처 별로 다른 명령어와 사용방법이 존재하며 크게 데이터 이동, 산술/논리 연산, 제어 흐름을 위한 명령어로 구분이 가능
- 데이터 이동: 메모리 <-> 메모리, 메모리 <-> 레지스터, 레지스터 <-> 레지스터
- 산술/논리 연산: 더하고 빼기, 비트 연산, 소수점 계산 등
- 제어 흐름: 분기. 호출, 반환 등
피연산자
- 빠른 연산을 위해 사용되는 레지스터 - 수행 문맥, 제어정보, 데이터 임시저장
- 레지스터는 CPU에 내장된 저장 공간으로, CPU 아키텍처마다 다름
명령어 유형, 의미, 대표 명령어 세트
- 데이터 이동 , scr에서 dst로 이동: mov, lea, les, push, pop, pushd, 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
'여러가지 공부' 카테고리의 다른 글
소프트웨어 역공학 시험 정리 (0) 2022.04.19 네트워크 VPN (0) 2022.04.18 도커와 쿠버네티스 비교 (0) 2022.04.18 소프트웨어 역공학 (리버싱, 어셈블리어) 2주차 정리 (0) 2022.04.17 기술적 취약점 분석 평가-방법 (수정필요) (0) 2022.04.17