목록Programming/Assembly (37)
외로운 Nova의 작업실
- 설치 sudo apt-get install nasm - 64비트 hello world section .data msg db "hello world", 0x0A, 0 section .text global _start _start: mov rax, 1 mov rdi, 1 mov rsi, msg mov rdx, 12 syscall mov rax, 60 mov rdi, 0 syscall - 64비트 컴파일 및 링킹 nasm -f elf64 test.asm -o test.o ld test -o test.o - 32비트 hello world section .data msg db "hello world", 0x0A, 0 section .text global _start _start: mov eax, 4 mov e..
안녕하세요. 어셈블리언어는 35장 이후로 부동소수점에 대한 내용과 ms-dos INT 21h 함수에 대해서 서술하고 있습니다. 이는 리버싱을 할때 크게 필수적이라고 생각되지 않아 어셈블리 공부를 종료하려합니다. 혹시라도 필요하다면 해당 내용을 다시 정리 및 공부해보겠습니다. 감사합니다.
안녕하세요, 이번 시간에는 메크로에대해서 정리 및 공부해볼까합니다. - 메크로 메크로는 전처리 단계 동안 어셈블러에 의해서 등록된 코드로 확장됩니다. - 메크로 정의 및 호출하기 메크로 정의는 아래와 같이 진행합니다. name MACRO parameter1, parameter2 ... source code ENDM 아래는 예시입니다. PrintX MACRO mov al, 'X' call WriteChar ENDM 메크로 호출의 경우 아래와 같이 진행합니다. macroname argument1, argument2... 위 PrintX의 호출은 아래와 같이 call 명령어 없이 사용합니다. .code printX 이렇게 선언을 하면 어셈블러는 전처리 단계동안 아래와 같은 코드로 확장시켜줍니다. .code m..
안녕하세요, 이번 시간에는 구조체에대해서 정리 및 공부해볼까합니다. - 구조체 어셈블리에서 구조체는 c언어의 구조체와 비슷합니다. 구조체의 변수들은 어셈블리에서 필드라고 부릅니다. - 구조체 정의하기 구조체를 정의할때는 아래와 같은 코드를 사용합니다. name STRUCT filed-declarations name ENDS 마우스 커서의 x좌표와 y좌표를 저장하는 COORD 구조체의 예시입니다. COORD STRUCT X WORD ? Y WORD ? COORD ENDS - 구조체 필드 정렬하기 가장 좋은 메모리 I/O 성능을 위해서는 구조체 멤버는 이의 데이터 타입에 맞는 주소에 정렬되어야합니다. 그렇지 않으면 이 멤버들을 접근하는데 CPU는 좀 더 많은 시간이 필요합니다. 예를들어 WORD는 2의 배수..
안녕하세요, 간단한 문자열을 넣으면 전치 암호화를 해주는 프로그램을 만들었다보니 기록을 하기위해 작성합니다. - 코드 ;-----------------INCLUDE------------------------- ; include c:\assembly\irvine32.inc includelib c:\assembly\irvine32.lib includelib c:\assembly\kernel32.lib includelib c:\assembly\user32.lib ;----------------------------------------------- .data plaintext BYTE 50 DUP(?) los DWORD 0 .code main PROC mov ecx, 64h call readPlainText ..
안녕하세요, 이번 시간에는 irvine32 라이브러리중에 문자열을 손쉽게 다룰 수 있게 해주는 스트링 프리미티브 명령어에대해서 알아보겠습니다. - 스트링 프리미티브 명령어 MOVSB, MOVSW, MOVSD : 데이터를 ESI가 가르키는 메모리에서 EDI가 가르키는 메모리로 복사한다. CMPSB, CMPSW, CMPSD : ESI와 EDI가 가르키는 두 메모리의 내용을 비교한다. SCASB, SCASW, SCASD : 누산기(AL,AX,EAX)의 값과 와 EDI가 가르키는 메모리의 내용을 비교합니다. STOSB, STOSW, STOSD : 누산기의 내용을 EDI가 가르키는 메모리에 저장합니다. LODSB, LODSW, LODSD : ESI가 가르키는 내용을 누산기로 적재합니다. 위 명령어들은 배열을 다루..
안녕하세요, 오늘은 프로시저를 정의하고 호출하는 강력한 수단에대해서 배워보도록 하겠습니다. - INVOKE, ADDR 우리는 지금까지 레지스터나 스택으로 프로시저에게 매개변수를 전달했습니다. 하지만 invoke 명령어를 이용하면 편하게 C언어에서 함수를 사용하는 것처럼 사용할 수 있습니다. 단, 매개변수는 역순으로 스택에 push됩니다. 바로 예제를 봐봅시다. .code invoke DumpArray, OFFSET array, LENGTHOF array, TYPE array 위 코드는 DumpArray 프로시저를 실행합니다. DumpArray 프로시저는 Array의 값들을 순서대로 콘솔에 출력해줍니다. 매개변수로는 배열의 주소, 배열의 길이, 배열의 크기를 주어야합니다. 위 코드는 MASM 어셈블러에 의..
안녕하세요, 이번시간에는 프로시저에서 사용할 수 있는 ENTER과 LEAVE 명령어 또, 지역변수를 만들어주는 LOCAL 명령어에 대해서 알아보겠습니다. - ENTER 명령어와 LEAVE 명령어 우리는 항상 스택을 사용하는 프로시저를 만들면 아래와 같은 코드를 사용하곤 했습니다. push ebp mov ebp, esp sub esp, numbytes//지역변수 공간 확보 위 3가지를 한번에 써주는 명령어가 ENTER 명령어 입니다. ENTER 명령어는 피연산자 2개가 있습니다. 하나는 지역변수 공간 확보를 위한 버이트수를 지정하는 상수이고, 다른 하나는 구문 중첩 수준 지정을 위한 상수입니다. 구문 중첩 수준 지정을 위한 상수는 항상 0으로 두면 됩니다. 그렇다면 예제를 하나 보도록 하겠습니다. plus..
안녕하세요, 이번시간에는 간접 참조에대해서 좀 더 정리를 해볼까합니다. LEA 명령어 간접 참조에 대해 설명하기 좋은 명령어가 있습니다. 바로 LEA 명령어 입니다. LEA 명령어에 대해 알기전에 한가지 물음을 던져 보겠습니다. 우리는 간접 참조를 한다고 하면 아래와 같이 사용합니다. .code mov eax, [ebx] 만약, ebx에는 0x12345678이라는 값이 들어있고, 0x12345678 번지주소에는 0xAABBCCDD 값이 있다고 치면 eax에는 어떤 값이 들어가게 될까요? 답은 0xAABBCCDD입니다. [ebx] -> [0x12345678] -> 0xAABBCCDD 로 변경됩니다. 즉, 0x12345678 번지주소에 있는 값으로 변경되는 것입니다. 그렇다면 만약 아래와 같은 코드는 어떻게..
안녕하세요. 이번시간에는 스택 프레임에대해서 알아보도록 하겠습니다. - 스택 프레임 스택 프레임은 스택안에서 함수에 의해 나눠진 공간을 의미합니다. 즉 main 프로시저안에서 프로시저1, 프로시저2, 프로시저3이 있고, 각 프로시저마다 스택에 변수를 넣는다면, 스택에는 프로시저1의 공간, 프로시저 2의 공간. 프로시저3의 공간으로 나눠지며, 각각을 스택 프레임이라고 할 수 있습니다. 스택은 상위주소에서 하위주소로 저장을 합니다. EBP는 Enhance Base Pointer로 각 스택 프레임의 첫 시작 포인터를 의미합니다. 스택프레임은 EBP가 저장된 주소를 기준으로 나뉘어지며, 항상 함수를 시작할때는 이전의 EBP값을 저장시켜주어야합니다. main 프로시저안에 프로시저1, 프로시저 2, 프로시저3 이있..