SystemHacking(95)
-
[7] 어셈블리 분기문 ( if, switch ) +cmp, jmp
1. cmp ( compare )레지스터나 메모리의 값을 변경하지 않는다플래그 레지스터에만 영향을 준다 ( flag register - 상태 레지스터 )-> SF(부호), CF(올림수), ZF(0,두개의 비교값이 같을 때 ) # 두 피연산자의 비교 ( CMP )cmp eax, ebx=> eax-ebx => 결과가 0인 경우: 같은 경우 => SF:0, CF:0, ZF : 1=> 결과가 음수인 경우 : eax SF:1 , CF:0, ZF: 0=> 결과가 양수인 경우 : eax > ebx => SF:0, ZF:0 , CF:0 0번이 시작7번 플래그() - SF 6번 플래그() - ZF cmp 10, 201 0 000111SF ZF cmp 10,100 1 000110SF ZFcmp 20,100..
2017.10.23 -
[6] 어셈블리 비트연산 ( shift, and, or, not )
1. 비트 연산 ( Shift 연산 )1-1. 부호가 없는 연산 shl : 왼쪽으로 이동shr : 오른쪽으로 이동 1-2. 부호가 있는 연산 sal : 왼쪽으로 이동sar : 오른쪽으로 이동 [ C언어에서 shift 연산 ]int eax=4;eax neg 명령어로 사용한다 부호를 변경할때 사용한다 mov eax, 15 neg eax=> eax 레지스터에는 -15가 저장되어 있다 나눗셈에서의 shift 연산 활용 mov eax, 0 ; eax 레지스터 초기화 mov ax, 10 ; ax 레지스터( 16bit ) 에 10 입력 mov dl, 4 ; dl 레지스터 ( 8bit ) 에 4 입력 div dl ; ax 레지스터 / dl 레지스터 : 16bit / 8bit => AH(나머지):AL(몫) shr ax,..
2017.10.20 -
[5] 어셈블리 계산기 , scanf , printf
어셈블리 ( NASM ) 언어로 간단한 계산 작업을 할 수 있는 계산기 코드를 작성해보도록 하겠습니다 [ 계산기 작성 코드 ] extern printf ; printf 라이브러리 가져온다 extern scanf ; scanf 라이브러리 가져온다 section .data argv: db '%d\n', 10, 00 argv1: db '%d %d', 10, 00 argv2: db '%d %d', 10, 00 argv3: db 'q:%d, r:%d', 10, 00 section .bss num_1: resd 1 ; 레이블 num_1 : 0x85858585 같은 메모리의 주소값 num_2: resd 1 ; 레이블 num_2 : 0x85858585 같은 메모리의 주소값 section .text global main..
2017.10.19 -
[4] 어셈블리 명령어 add,sub,mul,div
1-1> 덧셈: ADD 1-2> 뺄셈: SUB [ 덧셈 ] [ 코드 설명 ] main: mov dword [sum], 10 ; sum = 10 add dword [sum], 20 ; sum = sum + 20 push dword [sum] push argv1 call printf ; printf("%d",30) 뺄셈은 덧셈과 같은 형식으로 사용한다 1-3> 곱셈 MUL : unsigned(부호가 없는 연산) # 부호 없는 al, ax, eax 레지스터 의 값을 피연산자와 곱한다 # 형식 : mul register|memory # 원리 AL(8) * 8bit x/m -> AX ( 16bit ) AX(16) * 16bit x/m -> DX:AX ( 16bit 레지스터 2개를 사용한다 ) EAX(32) * 3..
2017.10.18 -
[3] 어셈블리 text section / mov / lea
[ 명령어 ] 1. MOV 할당 연산자와 비슷한 개념 mov r/m reg mov reg r/m mov r/m 상수 기본적인 형태 : mov dst, src ( src,dst 에 memory가 올 수 는 없다 ) 1-1> 레지스터에 데이터 저장하기 mov eax, 10 ; eax레지스터에 상수 10을 저장 1-2> 메모리에 데이터 저장하기 mov 크기 [레이블], 값 ; 레이블에 해당하는 주소안에 '크기' 만큼의 공간에 값을 저장 [ #vi operator.asm ] [ 코드 설명 ] extern printf section .data argv1: db '%d', 10, 00 test_1: dd 10 section .bss memory1: resd 1 section .text global main main..
2017.10.17 -
[2] 어셈블리 문자열 표현방식 / 데이터단위 / 레지스터 종류
NASM 이라는 어셈블러를 사용하도록 하겠습니다 NASM 에서는 한 개의 문자나 문자열 모두 ' ' 로 표현합니다 또한 문자와 문자를 , 를 사용해서 연결합니다 1> 'abcd' = 'ab' , 'cd' 2> 'Hello, World!!!' , 10 , 00 10과 00 은 무엇일까? 아스키 코드 10 => New Line ( Enter ) 아스키 코드 00 => NULL ( 문자열의 끝을 알림 ) * 어셈블러 기본 데이터의 단위 단위 크기 C NASM(문자로표현) byte 1 char b word 2 short w double word 4 int,long, float(32bit기준) d pointer(32bit기준) quad word 8 long long, double q ten byte 10 * 어셈..
2017.10.16