본문 바로가기

전체

[Assembly] 문자열 변환 실행환경- cpu : 인텔계열(64bit)- 컴파일러 : nasm- 리눅스 : ubuntu 16.04 LTS 설치방법- sudo apt-get install nasm 컴파일- nasm -f elf64 파일명.asm -o 파일명.o --> 목적파일을 만든다.- ld 파일명.o -o 파일명 --> 실행파일을 만든다. ex1_6.asmSYS_WRITE equ4;#define SYS_WRITE 4와 같은 의미SYS_STDOUT equ 1SYS_READ equ3SYS_EXIT equ1 section .datamsg db 'hello world 'len equ $ -msgend db 0x0a section .bss section .textglobal _start _start:mov eax,SYS_WRITEmov e.. 더보기
[Assembly] * 찍어보기 실행환경- cpu : 인텔계열(64bit)- 컴파일러 : nasm- 리눅스 : ubuntu 16.04 LTS 설치방법- sudo apt-get install nasm 컴파일- nasm -f elf64 파일명.asm -o 파일명.o --> 목적파일을 만든다.- ld 파일명.o -o 파일명 --> 실행파일을 만든다. ex1_2.asmsection .data msg db "star 10 ", 0x0A len equ $ -msg;msg의 길이를 len이라는 변수가 가지는데 ;equ는 상수란 의미이다. 쉽게 equ는 equal와 같으며;$ -변수 은 변수의 길이를 구하기 위한 명령어라 생각하자;즉 len = $ -msg 은 msg의 길이가 상수로 len에 대입된다. star times 10 db '*'; time.. 더보기
[Assembly] Hello World 출력하기 실행환경- cpu : 인텔계열(64bit)- 컴파일러 : nasm- 리눅스 : ubuntu 16.04 LTS 설치방법- sudo apt-get install nasm 컴파일- nasm -f elf64 파일명.asm -o 파일명.o --> 목적파일을 만든다.- ld 파일명.o -o 파일명 --> 실행파일을 만든다. ex1_1.asmsection .data ;데이터 영역msg db "Hello World" , 0x0A ;msg == 변수 이름 , db == 데이터 타입(byte) , 0x0a == 개행문자 ;db == byte(1바이트) , dw == word(4바이트) , dd == double(8 바이트) section .textglobal _start _start:mov eax, 4 ;4번은 sys_w.. 더보기
[Assembly] 어셈블리 명령어 어셈블리 명령어는 다음과 같다. 더보기
[Assembly] syscall table for x86_64 리눅스 64비트에서 어셈블리로 프로그래밍을 할때 각함수의 이름과 레지스터 사용법이다. syscall로 실행해야 한다. %raxSystem call%rdi%rsi%rdx%rcx%r8%r90sys_readunsigned int fdchar *bufsize_t count1sys_writeunsigned int fdconst char *bufsize_t count2sys_openconst char *filenameint flagsint mode3sys_closeunsigned int fd4sys_statconst char *filenamestruct stat *statbuf5sys_fstatunsigned int fdstruct stat *statbuf6sys_lstatfconst char *filenamest.. 더보기
[Assembly] syscall table for x86 리눅스에서 어셈블리로 컴파일을 할떄 system call number을 알아야 하는데 32비트에서는 int 0x80으로 실행을 한다.(여기서 int는 interrupt의 약자이다.) 이 system call number 가 정이되어 있는 곳은 \usr\include\asm\unistd.h 에 지정되어 있다. %eaxNameSource%ebx%ecx%edx%esx%edi1sys_exitkernel/exit.cint----2sys_forkarch/i386/kernel/process.cstruct pt_regs----3sys_readfs/read_write.cunsigned intchar *size_t--4sys_writefs/read_write.cunsigned intconst char *size_t--5s.. 더보기
[Assembly] 레지스터 개념 이외 64비트 범용 레지스터로는 rax ,rbx ,rcx ,rdx가 있다. 더보기
[Assembly] 실행환경 및 컴파일방법 어셈블리어 프로그래밍을 하기전에 자신의 컴퓨터 사양 및 컴파일러 등을 확인해야 한다. 어셈블리어 프로그래밍을 하기 앞서 저는 다음과 같은 실행환경에서 프로그래밍을 하고자 합니다. - cpu : 인텔계열(64bit)- 컴파일러 : nasm- 리눅스 : ubuntu 16.04 LTS NASM는 The Netwide Assembler의 약자입니다. 이 어셈블러는 여러 플랫폼사이에서의 포팅능력과 모듈화에 중점을 두고 개발되고 있는 32비트 및 64비트 지원하는 컴파일러입니다. 또한 가능한 간단하고 쉬운 문법을 사용합니다. 왜? NASM이냐는 NASM 튜토리얼에 있는 내용을 보면서 이해하도록 하겠습니다.우선, 무료 컴파일러이다. (2-clause BSD 혹은 simplified BSD 라이센스를 가지고 있다), .. 더보기
[Assembly] 어셈블리란?? :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: CPU 에는 해당 프로세서에 명령을 내리기 위해 고유의 명령어 세트가 마련되어 있는데 이 명령어 세트를 기계어라고 한다. 이 기계어는 숫자들의 규칙조합임으로 프로그래밍에 상당히 난해하다. 그래서 이 기계 명령어를 좀더 이해하기 쉬운 기호 코드로 나타낸것이 어셈블리어 인데, 우리가 어셈블리를 알아야 하는 이유는 우리가 원하는 리버싱 작업을 하고자 할떄 역어셈블러나 디버거를 쓰기 마련이다.역어셈블러는 기계어로 되어있는 파일을 읽어 들여 일정한 규칙하에 기계어를 어셈블리어로 .. 더보기
[C언어] 진법변환 1. 십진수 20을 2진수 8진수 16진수로 바꿔보자. 2진수 = 0001 0100 = 208진수 = 000 010 100 = 02416진수 =0001 0100 = 14 #include int main(){int num;scanf("%d", &num); printf("%d\n", num);printf("%o\n", num);printf("%x\n", num); return 0;} 2. 8진수 20을 2진수 10진수 16진수로 바꿔보자. 2진수 = 010 000 = 2010진수 = 0001 0000 = 1616진수 = 0001 0000 = 10 #include int main(){int num;scanf("%o", &num); printf("%d\n", num);printf("%o\n", num);prin.. 더보기