hello.asm 분석
======================================================
extern printf : 외부에 있는 printf를 가져다 쓰겠다
section .data ; initialized data segment
msg: db 'hello world!!!',10(뉴 라인),00(문자열을 마지막을 나타냄) : \n은 못씀
-- 아스키 코드
;;;"hello,world!!!\n" <- c언어로 표현
위와 똑같음 'H','e','l','l','o , world!!!"
section .text
global main
main: ; entry point
push msg
call printf
-- main도 레이블입니다. (여기서는 레이블 명이 꼭 main이어야 합니다. )
(gcc에서 main 레이블을 찾기 때문입니다)
======================================================
C언어
- 문자: '(작은 따옴표)
- 문자열: "(큰 따옴표)
- 'hello'(x), 'h'(o)
- "hello"(o), "h"
NASM
-문자, 문자열: '(작은 따옴표)
data segment에서 문자열을 표현
- 레이블: <white space> 크기 <white space> 초기값
- 변수 이름이 아니다!!
- 변수의 개념과는 다른 개념
- 주소의 또 다른 표현
함수를 호출하기 전에 문자열의 주소를 미리 push해 놓아야한다
기본 데이터의 단위(32비트)
단위 크기 C정의 NASM(문자)
byte 1 char b
word 2 short w
double word 4 int,long(32비트),float d
pointer(32비트)
quad word 8 long long,double q
ten byte 10
extern printf
section .datal initialized data segment
msg1: db '%s %s',10,00 ;char msg1[] = "%s %s\n"
msg2: db 'hello, ',00
msg3: db(datasegment의 byte) 'wolrd!!!',00
buffer: dd 1,2,3,4,5; int buffer[]={1,2,3,4,5};
section .text
global main
main : ;entry point
; printf("%s %s\n", "hello,","world!!");
push msg3
push msg2
push msg1
call printf
bss segment에서의 데이터 표현
- 레이블: <white space> 단위 <white space> 크기
-int a;
-char str[1024];
text segment에서 명령어 표현
- 레이블:
명령어
명령어
...
CPU가 사용하는 데이터 저장소
1. 메모리
2. 레지스터
- CPU가 사용하는 고속의 기억소자
- 특별한 용도를 위해서 사용하는 저장공간
- CPU당 한개의 레지스터만 제공
- 레지스터를 새로 생성, 수정, 삭제 등을 할 수 없다.
intel ia32 architecture에 intel 레지스터 잘 정리
1). 범용 레지스터
- EAX(Extended Accumulator Register) : 주로 연산할때 사용(용도가 다양함)
- EBX(Extended Base Register) : EAX 보조 용도
- ECX(Extended Counter Register) : 명령어 내에서 반복하거나 했을때의 횟수를 저장
- EDX (Extended Data Register)
2). 포인터 레지스터
- ESI(Extended Source Index): 주소를 다룸
- EDI(Extended Dst. Index): 문자열 복사할때 주로 사용
- ESP(Extended Stack Pointer): 주로 스택 세그먼트에서 사용
- EBP(Extended Base Pointer): 주로 스택 세그먼트에서 사용
- EIP(Extended Instruction Pointer): 명령어에 대한 주소를 가지고 있음
!EIP를 수정함으로써 시스템이 비정상으로 (흐름이 바뀜) 돌아가게 할 수 있습니다
3). 상태 레지스터
- EFLAGS : 상태정보를 나타냅니다
4). 세그먼트 레지스터(메모리 가상할때 이해해야합니다)
printf 함수 안에 여러개의 인자 넣은 코드 짜보기
C언어
어셈블리
어셈블리에서는 push를 뒤에서부터 넣는걸로 주의해야합니다!
[실습] 다음과 같이 출력하는 어셈블리 프로그램을 작성하세요
(0)_(0)(0)_(0)
(=^.^=)(*^.^*)
(_m_m_)(_m_m_)
코드
결과
'Security > System' 카테고리의 다른 글
[SYSTEM SECURITY]6.어셈블리 (scanf) (0) | 2017.10.19 |
---|---|
[SYSTEM SECURITY]5.어셈블리 (사칙연산) (0) | 2017.10.18 |
[SYSTEM SECURITY]4. 어셈블리 명령어(mov , lea) (0) | 2017.10.17 |
[SYSTEM SECURITY]2. 실행파일 구조 및 메모리 (0) | 2017.10.13 |
[SYSTEM SECURITY]1. REDHAT 6 설정과 컴파일 과정 (0) | 2017.10.13 |