! 레이블 Vs 변수.
1.주소 Vs 메모리
-포인터:메모리에 대한 직접 접근이 가능
-변수를 선언해서 사용하지 않는다.
-메모리를 직접 사용한다
1). 주소
-메모리상의 위치
-파일 오프셋과 동일한 의미
-정수
2).메모리
-데이터가 들어있는 실제 메모리
-메모리를 나타낼려면 []를 사용해서 씌어주면 된다
-[apple] 이렇게면 주소에 해당하는 메모리 를 가지고온다
-피 연산자가 메모리로 오는 경우에는 크기를 꼭 적어주어야 한다
ex)push dword [apple]
실습//진짜 중요// 개념을 확실히 하고 넘어가야한다
C언어 -> 어셈블리어 실습
주소와 메모리의 차이를 이해하고 넘어가야한다.
C코드
int a;
int b;
int main()
{
scanf("%d",&a); ->주소
scanf("%d",&b); ->주소
printf("a:%d\n",a); ->메모리
printf("b:%d\n",b); ->메모리
return 0;
}
어셈블리 코드
extern printf
extern scanf
segment .data
string1 db 'a:%d',10,00
string2 db 'b:%d',10,00
avg db '%d %d',00
segment .bss
a resd 1
b resd 1
segment .text
global main
main:
push b //주소 b 넣고
push a // 주소 a 넣고
push avg //주소 a b 입력받아서 넣을 string 문자 넣고
call scanf // scanf 해준다
push dword [a] //a주소에 있는 메모리값 가지고오고
push string1 // 문자열 가지고오고
call printf // 프린트해준다
push dword [b] //b 주소에 있는 메모리값 가지고오고
push string2//문자열
call printf// 프린트해준다
INTEL IA32 Architecture
-instruction set
-register
1.Register
CPU가 사용하는
-아주 빠른 기억장소
-고속의 기억 장치
-용도별로 여러개의 레지스터가 존재
1). 범용 레지스터:EAX, EBX, ECX, EDX (각각의 레지스터의 크기는 32bit)
EAX(Extended Accumulator Resgister) //사칙 계산 할때
EBX(Extended Base Resgister)
2). 포인터 레지스터:ESI, EDI, EBP, ESP, EIP ->레지스터 안에 값들을 전부 주소로 인식한다.
ESI(Extended Source Index)
EDI(Extended Dst. Index)
EBP(Extended Base Pointer)
3). 플래그 레지스터:EFLAGS
-프로세스에 대한 상태 정보를 나타낸다.
4). 세그먼트 레지스터:CS, DS, SS, ES, ....(각각의 레지스터 크기는 16bit)
입출력이 빠르다
레지스터 >> 메모리(주 기억 장치 ) >> 보조 기억장치(디스크,USB,..)
크기를 잘 알아야 한다
용량을 나누어 사용할 수 있는데 EAX는 32비트를 다 사용한다는 소리 이고 AX는 16비트를 사용한다는 소리인데
AX는 또 AH,AL로 8비트씩 나누어 사용할 수 있다는걸 표현한다
! 앞으로 프로그램을 만들면서는 두가지의 기억장치를 사용해야 한다 (레지스터,메모리)
2. 명령어
1). 데이터 복사: MOV
ex)
-int a=1
-두 피연산자가 모두 메모리가 올 수 없다.
88 /r MOV r/m8,r8 (첫번째 피연산자는 r레지스터/m메모리 둘중 하나가 올수 있다,두번째 피 연산자는 레지스터를 사용해야한다)
표를 보면 이런식으로 쭉 있는데 첫번째 두번째 연산자가 둘다 M 메모리가 올 수 없다.
imm-> 상수 표현법
연습
extern printf
segment .data
prompt_int '%d',10,00
segment .bss
segment .text
global main
main:
mov eax, 100 //첫번째 피연산자는 eax 레지스터 두번째 피연산자는 100 상수
push eax //eax에 넣어주고
push prompt_int //문자열을 불러온다
call printf //출력해준다
실습-위에서 했던 출력문을 a,b 가 바뀌어서 출력되도록 바꾸기
#> ./test
10
20
a: 10
b: 20
#> ./test
10
20
a:20
b:10
mov의 기본 설정을 이용해서 코딩을 해야하는데 mov는 메모리,메모리 롤 저장할 수 가 없다.
따라서 레지스터를 2개 이용해서 값을 저장하고 옮겨주어야 한다
extern printf
extern scanf
segment .data
string1 db 'a:%d',10,00
string2 db 'b:%d',10,00
input db '%d',00
segment .bss
a resd 1
b resd 1
c resd 1
segment .text
global main
main:
push a
push input
call scanf
push b
push input
call scanf
mov ebx,dword [b]
mov eax,dword [a]
mov dword [b],eax
mov dword [a],ebx
push dword [a]
push string1
call printf
push dword [b]
push string2
call printf
'시스템 해킹' 카테고리의 다른 글
[시스템 해킹] 어셈블리 형변환, 분기문 (0) | 2018.01.17 |
---|---|
[시스템 해킹] 어셈블리 사칙연산 (0) | 2018.01.16 |
[시스템 해킹] 어셈블리 언어(레이블,변수)표현법 (0) | 2018.01.12 |
[시스템 해킹] Compile (0) | 2018.01.12 |
[시스템 해킹] 환경 구성하기 (0) | 2018.01.12 |