SystemHacking/Assembly(15)
-
프로세스의 메모리 구조 ( + ESP, EBP )
[root@EH 3797]# cat maps 00000000-08048000 사용하지 않는 메모리 주소 08048000-08049000 r-xp 00000000 03:01 425373 /root/a.out : 1000 , 4096byte ,4K: text section - 코드가 위치하는 주소 08049000-0804a000 rw-p 00000000 03:01 425373 /root/a.out : 1000 , 4096buyr ,4K: data section( data,bss,heap ) - 전역변수, 힙 공간 등의 주소 08xxxxxx ~ 40xxxxxx : HEAP 영역을 위한 예약된 영역 40xxxxxx : 공유라이브러리영역 40000000-40013000 r-xp 00000000 03:01 3101..
2017.10.25 -
[8] 어셈블리 반복문 연습
C언어 반복문을 어셈블리로 직접 작성해보자 [ C언어 ]- 문자열의 끝을 파악해서 문자개수를 세고, 문자열의 뒤에서부터 출력한다 str buffer[1024] ; int index ; int i=0 ; int main(){ scanf("%s",string); while( string[i] != null ){ i++; } index--; for( i=index; i >= 0 ; i-- ){ printf("%c",string[i]); } printf("\n"); return 0; } [ 어셈블리 ] str string[1024]; int index; int i=0; scanf("%s",string); while( string[i] != null ){ i++; } index = i; while( i < 0 )..
2017.10.24 -
[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