# assembly

77개의 포스트

[Assembly] 어셈블리 명령어 정리하기

Assembly(어셈블리)란? 기계어와 1:1 대응 되는 저급언어(Low-Level Language)로 컴퓨터 구조마다 명령어가 다르다는 특징이 있다. 대표적으로 Intel문법과 AT&T 문법이 있다. | | Intel | AT&T | | --- | --- | --- | | 레지스터 표현 | eax | %eax | | 상수 표현 | h(16진수), b(2진수), o(8진수) → 10h | $숫자 → $0x10 | | operand 위치 | destination, source | source, destination | | 메모리 주소 참조 | [eax] | (%eax) | | 레지스터 + offset 위치 | [eax + 숫자] | 숫자(%eax) | Register(레지스터) | 레지스터 이름 | 역할 | | --- | --- | | EAX | 함수의 return 값 저장 레지스터 | | **EB

2023년 7월 30일
·
1개의 댓글
·

Quiz: x86 Assembly 2

CODE Question. > 다음 어셈블리 코드를 실행했을 때 출력되는 결과로 올바른 것은? Solution.

2023년 6월 17일
·
0개의 댓글
·

Quiz: x86 Assembly 1

CODE Question. >end로 점프하면 프로그램이 종료된다고 가정하자. 프로그램이 종료됐을 때, 0x400000 부터 0x400019까지의 데이터를 대응되는 아스키 문자로 변환하면? Solution. 1. mov dl, BYTE PTR[rsi+rcx] rsi + rcx =0 + 0x400000 0x400000이고 메모리 0x400000번지에 있는 값을 1바이트(8비트)만큼 참조하면 0x67. 이값을 dl에 대입 2. xor dl, 0x30 0x67과 0x30을 xor 연산하면 01010111. 이는 0x57 3. mov BYTE PTR[rsi+rcx], dl xor 연산해서 나온값 0x57을 [rsi+rcx]위치에 이동시키고 이동시킨 값을 1바이트만 참조 0x400000 메모리 번지의 값은 0x57 4. inc rcx rcx의 값을 1증가시키면 rcx=1 5. cmp rcx, 0x19 6. jg end

2023년 6월 17일
·
0개의 댓글
·

Assembly - 명령어 스터디 정리

|이름|유형|명령어|예시|텍스트 |---|:---:|---|---| |mov|데이터 이동|메모리나 레지스터의 값을 옮길때 사용|mov eax, ebx |lea|데이터 이동|mov와 다르게 메모리나 레지스터의 유효주소를 이동시킴|lea eax, ebx |lnc|산술 연산|eax의 값을 1 증가시킨다 (++)|lnc eax |dec|산술 연산|eax의 값을 1 감소시킨다 (--)|dec eax |add|산술 연산|메모리나 레지스터의 값을 덧셈할때 쓰인다|add eax, ebx |sub|산술 연산|메모리나 레지스터의 값을 뺄셈할때 쓰인다|sub eax, ebx |cmp|비교|레지스터와 레지스터 값 비교|cmp eax, ebx |jmp|분기|특정한 곳으로 분기|jmp proc |int|분기|OS에 할당된 인터럽트 영역을 system call|int S0x80 |push|스택|eax의 값을 스택에 저장|push eax| |pop|스택|스택 가장 상위의 값을 꺼내서 eax에 저장|pop e

2023년 6월 17일
·
0개의 댓글
·

Assembly - 스택, 프로시저 명령어

참고! 매우 어려움 스택 명령어 1. push A A를 스택 최상단에 쌓음 2. pop A 스택 최상단의 값을 꺼내서 A에 대입 프로시저 (Procedure) 특정 기능을 수행하는 코드 조각. (= C언어의 함수) 프로시저를 사용하면 반복되는 연산을 프로시저 호출로 대체할수 있어서 전체 코드의 크기를 줄이고, 기능별로 코드 조각에 이름을 붙일수 있어서 가독성을 크게 높임 호출 (Call) 프로시저를 부르는 행위 프로시저를 호출할때는 프로시저를 실행하고나서 원래 실행 흐름으로 돌아와야 하므로, call 다음의 명령어 주소를 스택에 저장하고 프로시저로 rip를 이동시킴 1. call A A에 위치한 프로시저 호출 반환 (Return) 프로시저 코드에서 돌아오는 행위 1. ret 돌아갈 예정이였던 call 다음의 주소로 돌아감 스택프레임 함수별로 자신의 지역변수 또는

2023년 6월 17일
·
0개의 댓글
·

Assembly - 논리 연산, 비교, 분기 명령어

논리연산 명령어 * and, or, xor, not 등의 논리연산이 있음. * 논리연산은 비트 단위로 이루어짐 => 2진수로 변환에서 0이나 1 따져야함!!! 1. and A, B A와 B의 비트가 모두 1이면 1, 아니면 0 비트 단위로 분석한 후 A의 값이 바뀜 2. or A, B A와 B의 비트중 하나라도 1이면 1, 아니면 0 비트 단위로 분석한 후 A의 값이 바뀜 3. xor A, B A와 B의 비트가 서로 다르면 1, 같으면 0 비트 단위로 분석한 후 A의 값이 바뀜 * !!! xor 연산을 동일한값으로 두번 실행하면, 원래 값으로 돌아감 !!! * 4. not A A의 비트 전부 반전(1의 보수 기법) 비교 명령어 값은 저장하지 않는다 플래그 설정용! 비교 명령어는 두 피연산자(오퍼랜드)의 값을 비교하고, 플래그를 설정한다! `ZF,

2023년 6월 17일
·
0개의 댓글
·

Assembly - 데이터 이동, 산술연산 명령어

x64 어셈블리 언어 명령어(연산코드) + 피연산자(오퍼랜드) 어셈블리어에서는 메모리에 접근할때 주소를 계산해야한다 !!! 피연산자(오퍼랜드)에 올수있는 3종류 상수 (Immediate Value) 레지스터 (Register) 메모리 (Memory) 그중에서도 메모리 오퍼랜드는 []` BYTE : 1바이트 WORD : 2바이트 (16비트) 워드 DWORD : 4바이트 (32비트) 더블 워드 QWORD : 8바이트 (64비트) 쿼드 워드 1. 데이터 이동 명령어 어떤 값을 레지스터나 메모리에 옮기도록(대입하도록) 지시 1) mov A, B B에 들어있는 값을 A에 대입 2) lea A, B B의 "유효 주소"를 A에 저장한다. mov와 lea의 차이점은 유효 주소를 저장하냐, 메모리의 값을 직접 저장하냐의 차이 2. 산술 연산 명령어 덧셈,뺄셈,곱셈,나눗셈

2023년 6월 17일
·
0개의 댓글
·

연산

📌사칙연산 입력받아오기 10진수를 받아올건데 byte 어디에 받아올건가? 출력하기 al을 1byte만큼 출력 더하기 더하기 연산 a는 레지스터 or 메모리 b는 레지스터 or 메모리 or 상수 단! a, b 모두 메모리는 X 레지스터 + 상수 add al, 1 ; 레지스터 + 상수 PRINT_DEC 1, al ; 1 + 1 = 2 NEWLINE 레지스터 + 메모리 레지스터 + 레지스터 메모리 + 상수 메모리 + 레지스터 빼기 곱하기 곱하기는 규칙이 있다 1byte mul bl -> al * bl 연산결과를 ax에 저장 2byte mul bx => ax * bx 연산 결과는 dx(상위 16비트) ax(하위 16비트)에 저장 … mul ebx => eax * ebx ex) 5 * 8 은? 나누기 나누기도 규칙이 있다 1byte d

2023년 4월 17일
·
0개의 댓글
·

문자와 엔디안

📌문자 1byte 0x11 연속으로 a에 넣는다 📌아스키코드 문자를 나타내는 것 문자열의 끝을 나타내기 위해서 0x00 붙여줌 msg부분을 긁어와서 아래와 같이 만들어도 똑같이 Hello World가 뜬다 📌엔디안 숫자가 메모리에 저장될 때 저장하는 방법

2023년 4월 17일
·
0개의 댓글
·
post-thumbnail

SUB main() Dim oDoc As Document = ThisDoc.Document Dim oDef As Object = oDoc.ComponentDefinition Dim oDcc As ComponentOccurrence = Nothing On Error Resume Next '부품과 어셈블리 모두 적용할수 있는 코드 Dim oBody As SurfaceBody If TypeOf oDoc Is PartDocument Then oDef = DirectCast(oDoc, PartDocument).ComponentDefinition oBody = oDef.SurfaceBodies(1) ElseIf TypeOf oDoc Is AssemblyDocument Then oDef = DirectCast(oDoc, AssemblyDocument).ComponentDefinition Dim oOcc As ComponentOccurrence = oDoc.Comp

2023년 4월 12일
·
0개의 댓글
·

변수와레지스터

📌exe파일구조, 메모리구조 파일에 정보들이 저장되어 있다 실행파일 실행 -> 메모리에 올라간다 데이터뿐만 아니라 온갖 정보들이 올라간다 📌메모리 레지스터 section .data 초기화된 데이터 \[변수이름] [크기] [초기값] [크기] db(1) dw(2) dd(4) dq(8) define byte 8bit(1byte) define word 16bit(2byte) define double word 32bit(4byte) def

2023년 4월 9일
·
0개의 댓글
·

어셈블리어

📌어셈블리어 기초 SASM 어셈블리어 공부 위한 IDE(통합개발환경) 어셈블러(번역기) 우리가 적어놓은 코드를 기계어로 번역해준다(컴파일러랑 같은건데 어셈블리어라서 어셈블러인듯?) 실행파일구조 .text .data 대강 이렇게 되어있다 데이터기초 비트, 바이트 비트 : 0, 1 바이트 : 여덟개의 비트로 구성된 데이터의 양을 나타내는 단위 10진수 (0 1 2 3 4 5 6 7 8 9) 10 11 12 13 ... 19 20 2진수 (0 1) 0 1 10 0b0 0b1 0b10 16진수 (0 1 2 3 4 5 6 7 8 9 A B C D E F) 0x00 0b 1001 0101 = 0x95 비트 바이트 워드 8bit

2023년 4월 6일
·
0개의 댓글
·

[Assembly] Assembly - 1

어셈블리어란? 컴퓨터(CPU)의 기계어와 치환되는 언어 ⚠️ CPU가 달라지면 어셈블리어도 달라진다!\ 배경지식 CPU에 사용되는 명령어 집합 구조는 다양하다 📌 명령어 집합 구조 : ISA Instruction Set Architecture → 다양한 만큼 어셈블리어도 다양하다. 📌 내 컴퓨터의 환경은 x64아케텍처를 대상으로 하므로 x64만 어셈블리어를 다룬다 어셈블리어의 기본 구조 💡 명령어 + 피연산자 명령어 개요 피연산자의 종류 상수 ( Immediate Value ) 레지스터 ( Register ) 메모리 ( Memory ) 📌 메모리 피연산자는 [ 대괄호 ] 로 둘러쌓인 것으로 표현됨 앞에 크기 지정자(size directive) TYPE PTR 추가

2023년 4월 5일
·
0개의 댓글
·
post-thumbnail

[System Hacking][DreamHack][Stage2] x86 Assembly: Essential Part(1)

Introduce 시스템 해커는 어셈블리어어로 작성된 소프트웨어에서 취약점을 발견해야한다 Assembly Language Assembler 개발자들이 작성한 어셈블리어 -> 컴퓨터가 이해 할 수 있는 기계어로 치환하는 통역사 Disassembler 기계어 -> 어셈블리 언어로 번역 Assembly Language and x86-64 Assembly Language CPU 에서 사용되는 ISA (Instruction Set Architecture) 가 여러 종류인 것 과 같이 다양한 수의 어셈블리어가 존재한다 x64 Assembly Language 문법 구조 명령어(operation Code, Opcode) 피연산자 (Operand) 명령어 ; Opcode 데이터 이동 (Data Transfer) mov, lea 산술 연산 (Arithmetic) inc, dec, add, sub 논리 연산 (Logical

2023년 3월 29일
·
0개의 댓글
·

패미컴 게임을 만들어보자! 4번째 6502 addressing modes

어셈블리를 처음부터 하려니 정말 어려운거 같다 심지어 자료가 영어로 돼 있어서 해석먼저 하는게 고역이다. 오늘 배운 내용은 6502 프로세서의 어드레싱 모드다 immediate: 말그대로 즉각적으로 값을 넣는 모드다 주소 형식으로 값을 보내는 것이 아니라 매우 직관적이고 사용할땐 # 사인을 앞에 붙인다 ex) LDA #10 ;Accumulator에 십진수 10 값을 로드한다. direct: direct 모드는 주소를 직접적으로 보내어 그 주소에 있는 값을 참조하는 모드다. 주소에 어떤값이 있는지만 생각하면 돼 사용하기 편하다. ex)LDA $1011 ;Accumulator에 $(16진수)1011 번지에 있는 값을 로드한다. indexed direct: 여기서부턴 X,Y레지스터를 사용한다. 주소,X or Y의 형태로 사용하고 주어진 주소에 X 혹은 Y 레지스터에 있는 값만큼 더한 뒤의 주소를 참조한다. 루프를 사용하여 여러 주소를 참조할때 사용하는 용도로 활용할 수 있을 것

2023년 3월 26일
·
0개의 댓글
·
post-thumbnail

[Reversing] 어셈블리어 기초

어셈블리어란? &nbsp 우리가 평소에 이용하는 C언어나 파이썬으로 코딩한 파일은 그대로 실행할 수 없고, 컴퓨터가 이해할 수 있는 기계어로 바꿔줘야 한다. 이러한 기계어를 사람이 알아보기 쉬운 니모닉 기호를 통해 표현한 언어를 어셈블리어라고 한다. 이런 어셈블리어는 Intel과 AT&T 문법으로 나뉘는데, 이번 글은 Intel 문법에 기반해 정리할 예정이다. >기계어는 컴퓨터가 이해할 수 있는 언어로, 0과 1로만 이루어져 있다. 어셈블리어 &nbsp 어셈블리어는 명령어(Opcode)와 피연산자(Operand)로 구성된다. 어셈블리 코드는 항상 다음과 같은 형태로 작성된다. 이 때, Operand1은 Destination, Operand2는 Source이다. 예를들어, 데이터를 이동시키는 mov 명령어의 경우, "mov eax, ebx" 형태로 사용되며, ebx의 값을 eax로 이동시키라는 의미를 담고 있다. &nbsp 어셈블리

2023년 3월 21일
·
0개의 댓글
·

OS 개발 - 2

개발 환경 구축 설치할 것은 딱 3가지이다 nasm, Vmware, 자신에게 맞는 IDE 1-NASM 설치 nasm stable 버전으로 받을 것이다 클릭해 들어가면 nasm의 index of가 나오게 된다 여기서 win64에 들어가 exe 파일을 받아 관리자 권한으로 실행해 준다 이제

2023년 2월 5일
·
0개의 댓글
·

OS 개발 - 1

OS 개발 전 일러둘 것들 OS 개발은 어셈블리, c에 능숙하거나 리눅스 커널을 빠삭하게 이해하고 있는 이들에게 추천한다 필자가 참고한 블로그: > https://itguava.tistory.com/ 저 세 가지는 굳이 이해하고 있지 않아도 된다, 앞으로 작성할 코드는 필자가 열심히 설명할 것이다 하지만 이해하고 있으면 조금 더 쉽고 깊게 이해할 수 있으므로 공부하는 것을 추천한다 어셈블리 언어 라는 책은 kip irvine 선생님이 쓰신 최고의 어셈블리 책 중 하나이다 이 글에서 쓰게 되는 언어는 nasm 일지라도 기본적 어셈블리 개념은 두고두고 참고서로 이용할만하다 리눅스 커널은 전 세계 개발자들의 도서관이라고 할 수 있다 한 번쯤은 분해하여 씹고 뜯고 맛보는 걸 추천한다 다음 포스트에서는 개발 환경을 구축해 보겠다

2023년 2월 5일
·
0개의 댓글
·

Linux System Programming(1) - System Call

시스템 콜(System Call) 시스템 프로그래밍은 시스템 콜에서 시작해서 시스템 콜로 끝난다. 시스템 콜이란 운영체제에 리소스나 서비스를 요청하려고 사용자 영역(텍스트 편집기나 게임...)에서 시작해서 커널 내부로 들어가는 함수 호출이다. 시스템 콜에는 read(), write() 같은 익숙한 함수부터, getnarea(), settid_address() 같은 생소한 함수 까지 그 범위가 다양하다. 리눅스에서 구현된 시스템 콜은 다른 대부분의 운영체제 커널에서 제공하는 시스템 콜보다 더 적다. 예를 들어 x86-64 아키텍처의 리눅스 시스템 콜은 약 300여 개인데 비해 마이크로소프트 윈도우에는 수천여 개의 시스템 콜이 있다. 리눅스 커널에서는 표준 시스템 콜을 Alph, x86-64, PowerPC 같은 개별 아키텍처별로 확장하여 구현하고 있다. 그래서 아키텍처별로 사용할 수 있는 시스템 콜이 조금씩 다를 수 있지만, 시스템 콜의 90% 이상은 모든 아키텍처

2022년 12월 28일
·
0개의 댓글
·

Linux System Programming(0) - What is System Programming

시스템 프로그래밍의 개념 시스템 프로그래밍이란 커널 및 핵심 시스템 라이브러리를 직접 사용하면서 하위 레벨에서 동작하는 시스템 소프트웨어를 작성하는 기술을 일컫는다. 셸, 텍스트 편집기, 컴파일러, 디버거, 시스템 유틸리티 및 시스템 데몬은 모두 시스템 소프트웨어이다. 네트워크 서버, 웹서버, 데이터베이스 역시 시스템 소프트웨어의 종류이며 이 런 스프퉤어는 주로 커널과 C 라이브러리를 직접 사용한다. GUI 애플리케이션 같은 소프트웨어는 시스템 소프트웨어보다 상위 레벨에서 동작하며 아주 가끔 필요한 경우에만 하위 레벨을 필요로 한다. 리눅스(Linux) 운영체제 리눅스는 리누스 토르발스(Linux Torvalds)가 처음 개발했으며, 지금은 오픈소스 운영체제의 대표가 되었다. 리눅스는 유닉스(UNIX)의 목표와 철학을 공유하고 있지만, 리눅스는 실용성에 집중하며 리눅스만의 독자적인 길을 만들어가는 중이다. 리눅스는 유닉스의 기본적인 면만 제외하면, 추가적인 시스템 콜 지원과

2022년 12월 28일
·
0개의 댓글
·