Assemble

    [Assemble] 반복문 구현하기

    오늘은 어셈블리로 반복문을 구현해 볼라 합니다. 원하는 이름의 텍스트 파일을 만들어주고 데이터 섹션에 A를 저장해둘 데이터를 만듭니다. write 시스템 콜을 위한 변수들을 초기화 합니다. r10은 반복문의 조건을 위해 변수입니다. 반복을 위한 함수를 만들어줍니다. cmp는 r10 과 100의 관계를 비교하는 명령어이고 je는 (jump equal)를 뜻합니다. 만약 결과값이 r10과 100을 비교했을때 같다면 done으로 점프를 한다는 의미입니다. [ ※ done 함수는 나중에 나옵니다. ] rax를 다시 초기화해준 이유는 어떤 함수를 실행시키면 그 함수의 결과값이 rax에 대입이 되기 때문에 초기화를 해야 합니다. inc는 증가를 위한 명령어입니다. r10을 하나씩 증가시킵니다. 그다음 jmp명령어를..

    [Assemble] 기초 문법 정리

    어셈블리의 기초 문법을 정리하겠습니다. 1. MOV A의 값을 B에 대입합니다. [ Ex) mov rax, 0 는 rax에 0을 대입하는것과 같음 ] 2. LEA A의 값을 B의 값으로 연산을 포함하여 복사 [ Ex) LEA EAX, [EAX + 1000]은 EAX에 1000을 넣은 값을 다시 EAX에 삽입] 3. JMP 특정한 위치로 건너 뛰어 코드를 실행 (한번 위치로 가면 다시 돌아오지 X) [ Ex) JMP A 는 A의 위치로 점프를 해 코드를 실행한다는것과 같음 ] 4. CALL 함수를 호출한 다음 다시 원래 위치로 돌아올 때 사용 [ JMP와 다른 점은 RET(리턴 주소) 를 이용해 다시 원래 위치로 돌아온다는 특징이 있음] 5. NOP 아무 작업도 하지 않는 명령어 [ 1Byte의 빈 공간을..

    [Assemble] 입력한 값을 출력하는 프로그램 만들기

    오늘은 입력한 값을 그대로 출력하는 프로그램을 어셈블리로 구현해볼라고 합니다. 일단 텍스트 섹션을 만들어줍니다.오늘은 특정 변수에 문자를 집어넣어 하는 것이 아니기 때문에데이터 섹션은 만들어 주지 않아도 됩니다. 여기서 xor이라는 것이 나옵니다. rax는 만약 같은 값이 있다면 0을 반환하고다른 값이 있다면 1을 반환합니다. 위 코드에서는 rax로 같기 때문에 rax에 0을 대입한것과 같다[ mov rax, 0 이라고 적어도 무방하다 :) ] 그다음 rbx와 rcx, rdx도 rax을 이용하여 0으로 초기화를 해준다. rbx : 베이스 레지스터 rcx : 카운터 레지스터rdx : 데이터 레지스터 sup은 공간 확보를 위한 명령어 입니다. 즉 rsp( rbp = 스택이 시작하는 베이스 포인트 )위로 64..

    [Assemble] 메모리 구조

    오늘은 메모리 구조에 대해 정리해보겠습니다. 메모리 구조를 그림을 표현한다면 저렇게 형상화 할 수 있습니다. 1. Stack Stack 영역에는 함수들과 지역변수에 대한 정보들이 저장된다고 합니다. 함수를 호출할때마다 Stack 영역에 쌓인다고 합니다. 그래서 취약점이 많이 발견되는 부분이라 하고 BOF같은 공격을 실행할 수 있는 영역이라고 합니다. 2. heap 동적으로 메모리가 할당되는 변수들에 대한 정보가 저장되는 공간입니다. c언어에서 malloc()과 같은 함수를 사용하여 동적할당이 된 변수들은 heap 구역에 정의가 됩니다. 3. bss & data 프로그램에서 쓰여질 변수들이 실질적으로 위치하는 공간입니다. bss는 초기화가 되지 않은 변수들이 위치하는 공간이고, data는 초기화가 된 변수..

    [Assemble] Hello World!

    이번에는 칼리 리눅스 환경에서 어셈블리 언어로 Hello World! 를 띄워 볼라 합니다. 처음 nano를 사용하여 HelloWorld.s 파일을 만들겠습니다. 텍스트 저장을 위한 데이터 섹션과 텍스트 섹션을 정의 합니다. 그리고 start 부분을 정의 합니다 이 부분은 밑에 참고 자료와 함께 정리하겠습니다. 소스코드를 다 작성하였다면 Ctrl + x 키를 누른 후 y를 눌러 저장을 합니다. 리눅스 환경에서는 ls를 사용하여 파일을 확인 할 수 있으므로 아까 만든 HelloWorld.s가 보입니다. nasm 명령어를 활용하여 형식자를 .o로 바꿔주겠습니다 ld 명령어를 활용해 .o를 실제 우리가 볼 수 있는 파일로 변환을 해주겠습니다. ls를 활용해 보면 아까 변경했던 파일들이 보입니다. 그 중 최종 ..