일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- wargame
- SuNiNaTas
- Los
- Remote File Inclusion
- Dremhack
- 정보보안
- 드림핵
- Hackerfactory
- File Upload Vulnerability
- Insecure CAPTCHA
- Cross Site Scripting
- Lord of SQL Injection
- Weak Session IDs
- 정보보호
- 워게임
- DreamHack
- Web Hacking
- 웹 해킹
- H4CKINGGAME
- 써니나타스
- DVWA
- 빡공팟 4기
- XSS
- TeamH4C
- webhacking.kr
- bypass CAPTCHA
- 빡공팟 6기
- DOM-Based XSS
- 해커팩토리
- sql injection
- Today
- Total
도카이트
[HawkIS] 어셈블리어로 문자열 출력하기 본문
[기초 사전학습] - CPU 구성 및 레지스터의 종류와 용도
어셈블리어
- CPU의 Instruction을 직접 사용
- 하드웨어 의존적
CPU 구성
- 연산 장치(ALU, Arithmetic and Logic Unit)
- 제어 장치(Control Unit)
- 레지스터(Register)
연산 장치
- 내부장치
- 가산기 : 덧셈 연산 수행
- 보수기 : 뺄셈 연산 수행, 1의 보수나 2의 보수 방식
- 시프터 : 비트를 오른쪽이나 왼쪽으로 이동해 나눗셈과 곱셈 수행
- 관련 레지스터
- 누산기 : 연산의 중간 결과 저장
- 데이터 레지스터 : 연산에 사용할 데이터 저장
- 상태 레지스터 : 연산 실행 결과로 나타나는 양수와 음수, 자리올림, 오버플로 상태 기억
제어 장치
- 내부장치
- 명령 해독기 : 명령 레지스터에 있는 명령을 해독하여 부호기로 전송
- 부호기 : 명령 해독기가 전송한 명령을 신호로 만들어 각 장치로 전송
- 주소 해독기 : 명령 레지스터에 있는 주소를 해독하여 메모리의 실제 주소로 변환 후, 이를 데이터 레지스터에 저장
- 관련 레지스터
- 프로그램 카운터 : 다음에 실행할 명령의 주소 저장
- 명령 레지스터 : 현재 실행 중인 명령을 저장
- 메모리 주소 레지스터 : 주기억장치의 번지를 저장
- 메모리 버퍼 레지스터 : 메모리 주소 레지스터에 저장된 주소의 실제 내용을 저장
레지스터의 종류와 용도 (16, 32bit)
범용 레지스터(General Register)
: 연산 장치가 수행한 계산 결과의 임시 저장, 산술 및 논리 연산, 주소 색인 등 여러 목적으로 사용할 수 있는 레지스터
- EAX, 누산기 : 산술 연산에 사용, 함수의 결과 값 저장
- EBX, 베이스 레지스터 : 특정 주소 저장, 주소 지정을 확대하는 인덱스로 사용
- ECX, 카운트 레지스터 : 반복적으로 실행되는 특정 명령에 사용, (루프 반복, 시프트 이동)
- EDX, 데이터 레지스터 : 일반 자료를 저장 (입출력 동작에 사용)
세그먼트 레지스터(Segment Register)
: 각 세그먼트의 주소를 지정하는 레지스터
- CS, 코드 세그먼트 레지스터 : 실행할 기계 명령어가 저장된 메모리 주소를 지정
- DS, 데이터 세그먼트 레지스터 : 프로그램에서 정의된 데이터, 상수, 작업 영역 메모리 주소 지정
- SS, 스택 세그먼트 레지스터 : 프로그램 스택 세그먼트의 시작 주소를 저장 메모리 상에 스택 구현을 가능하게 함
- ES, FS, GS, 엑스트라 세그먼트 레지스터 : 문자 연산과 추가 메모리를 지정하는데 사용하는 여분의 레지스터
// 세그먼트(Segment)
: 프로그램에 정의한 메모리 상의 특정 영역으로 코드, 데이터, 스택 등을 포함. 세그먼트는 메모리의 대부분에 위치할 수 있음.
포인터 레지스터(Pointer Register)
: 프로그램의 실행 과정에서 사용하는 주요 메모리 주소 값을 저장, 실제 메모리 상의 주소 참조
- EBP, 베이스 포인터 : SS 레지스터와 함께 사용하여 스택 안의 변수 값을 읽는데 사용.
스택 세그먼트에서 현재 호출해서 사용하는 함수의 시작 주소 값을 저장 함수로 전달되는
지역 변수 등을 참조할 때 기준이 되며, ESP 레지스터와 함께 써서 스택 프레임(Stack Frame)을
형성하기도 한다. - ESP, 스택 포인터 : SS 레지스터와 함께 사용하며, 스택의 가장 끝(하위) 주소를 가리킴 스택은 높은 주소에서 낮은 주소로
이동하면서 데이터를 저장하므로, 스택이 확장되면 스택 포인터도 높은 주소에서 낮은 주소로 값을 변경 - EIP, 명령 포인터 : 다음 명령어의 오프셋(상대 위치 주소)을 저장하며, 현재 실행 중인 코드 세그먼트에 속한
현재 명령을 가리킴. CS 레지스터와 합쳐 다음에 수행할 명령 주소를 형성
인덱스 레지스터(Index Register)
: 데이터를 복사할 때 출발지와 목적지 주소를 가리키는 레지스터. 주로 메모리의 한 영역에서 다른 영역으로
데이터를 연속적으로 복사할 때 사용
- EDI, 목적지 인덱스 : 목적지 주소 값 저장
- ESI, 출발지 인덱스 : 출발지 주소 값 저장
플래그 레지스터
: 32비트 크기를 가지고 있으며, 컴퓨터의 다양한 상태를 나타내는 비트를 포함
- EFLAGS, 플래그 레지스터 : 연산 결과 및 시스템 상태와 관련된 여러 가지 플래그 값 저장
** 사용 목적별 레지스터 맵핑
어셈블리어를 이용한 이름 출력
실습 환경
Ubuntu 18.04.6 LTS (VM)
시스템 정보
Linux ubuntu 5.4.0-135-generic #152~18.04.2-Ubuntu SMP Tue Nov 29 08:23:49 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
1. nasm 설치
sudo apt-get install nasm
2. asm 파일 생성 및 수정
vi dodoh4t.asm
3. 코드 작성
section .data
msg: db "Doyeon Kim (a.k.a. dodoh4t)",10
len: equ $-msg
section .text
global _start
_start:
mov rax, 1 ;Syscall id 1 -> write
mov rdi, 1 ;FD(File Descriptor) stdout
mov rsi, msg ;String address to write
mov rdx, len ;String length in bytes
syscall ;System call
_last:
mov rax, 60 ;Syscall id 60 -> exit
mov rdi, 0 ;Set exit code 0;
syscall
- section.data : 데이터 섹션. Static 변수, 상수를 지정 가능
- msg, db, 10 : msg는 변수명, db(define byte)는 타입, 10은 Escape Sequence(\n)
- equ $ : len의 메모리 주소를 equ로 생성하여 -msg, 바로 전 코드에서 주소를 빼면 문자열 길이 확인 가능(byte)
- section.text : 명령어 주소에 대응하는 코드
- global_start : 여러 파일을 컴파일 할 때 시작점(Entry Symbol)
- mov rax, 1 : 1 값을 rax 레지스터에 저장 (1 : sys_write)
- mov rdi, 1 : FD(File Descriptor, 1: Standard Output)
- mov rsi, msg : msg 변수의 주소를 가리키는 코드 행
- mov rdx, len : 문자열의 길이(size_t count)
- mov rax, 60 : 시스템콜 종료 (60 : exit)
- mov rdi, 0 : 에러 발생 X (return 0)
종합
:: sys_write 를 호출하여 file descriptor 1인 stdout에 msg 변수를 문자열 개수만큼 출력
** Static 변수
: 프로그램 시작부터 끝까지 메모리에서 값을 유지하는 변수
4. 컴파일 및 링크
nasm -f elf64 -g dodoh4t.asm -o dodoh4t.o
ld -o dodoh4t dodoh4t.o
5. 실행 및 출력 값 확인
./dodoh4t
- 정상적으로 문자열 값이 출력되는 것을 확인할 수 있다 !
'낙서장' 카테고리의 다른 글
[KISA] 개인정보 불법유통 국민 제보제란? (0) | 2024.08.28 |
---|---|
[낙서장] BoB 지원에 대한 소소한 끄적임 (1) | 2022.05.15 |