mov // 메모리나 레지스터의 값을 옮길 때





그림 레지스터, 즉시값


eax => 32bit => 4byte => c언어 [int]

ax => 16bit => 2byte => c언어 [short]

ah => 8bit => 1byte => c언어 [char]

al => 8bit => 1byte => c언어 [char]



1 # include <stdio.h>

2

3 int main(void)

4 {

5 int v1 = 10;

6 return 0;

7 }


====================================================================================================
1 # include <stdio.h>
2
3 int main(void)
4 {
5 int v1 = 10;
6 return 0;
7 }

(gdb) disassemble main

Dump of assembler code for function main:

   0x080483eb <+0>: push   ebp

   0x080483ec <+1>: mov    ebp,esp

   0x080483ee <+3>: sub    esp,0x4

   0x080483f1 <+6>: mov    DWORD PTR [ebp-0x4],0xa

   0x080483f8 <+13>: mov    eax,0x0

   0x080483fd <+18>: leave  

   0x080483fe <+19>: ret    

End of assembler dump.


====================================================================================================


mov 로 스왑을 만들어 보았다.


# include <stdio.h>


void main(void)

{

char v1 = 10;

char v2 = 20;

char v3 = 0;

printf("before v1=>%d   v2=>%d\n", v1, v2);

__asm

{

mov al, v1;

mov bl, v2;

mov ah, al;

mov al, bl;

mov v1, al;

mov v2, ah;

}

printf("before v1=>%d   v2=>%d\n", v1, v2);

}

'어셈블리' 카테고리의 다른 글

nasm  (0) 2017.07.01
어셈블리어_TEST  (0) 2017.06.23
어셈블리어 STEP_1  (0) 2017.06.23
어셈블리 + irvine + 문자 출력  (0) 2017.06.22
irvine 어셈블리 계산기  (0) 2017.06.18

[http://egloos.zum.com/ceRan/v/4408175  이 곳을 참고 했다는 것을 미리 밝힌다.]


시작 날짜 2017_06_23

내 맘대로 정리임을 밝힌다. 따라서 신뢰할 수 없는 정보도 있다. 알아서 필터링 해라 

어셈블리어란?

어셈블리어(영어: assembly language) 또는 어셈블러 언어(assembler language)[1] 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다. (출처 : 위키 백과)



================================================

어셈블리어의 특징

-> 하드웨어와 소프트웨어의 가장 밑 바닥에 있는 언어

-> 기계어와 거의 같은 수준에 있는 언어

-> 저급언어에 속한다.

(출처 : 나무위키 : 기계어(機械語)는 CPU가 직접 해독하고 실행할 수 있는 비트 단위로 쓰인 컴퓨터 언어를 통틀어 일컫는다. 기계어는 프로그램을 나타내는 가장 낮은 단계의 개념이다.) 

================================================

어셈블리어 

종류

[ㄱ] GAS (GNU Assembler)

[ㄴ] MASM (Microsoft Macro Assembler) -------> 관련 사이트 [http://www.masm32.com/]

: Visual studio 에서 사용

[ㄷ] NASM (Netwide Assembler) ---------------> 관련 사이트 [http://www.nasm.us/]

: 리눅스에서 주로 사용 (물론 윈도우에서도 사용가능 함)

[ㄹ] YASM -----------------------------------> 관련 사이트 [http://yasm.tortall.net/]


등이 있다고 한다.   

================================================

어셈블리어

장점

[ㄱ] 프로그램의 실행 속도가 매우 빠르다.

[ㄴ] 프로그램의 크기가 매우 작다.

[ㄷ] 어떤 프로그램이라도 만들수 있다.

등등등

================================================

단점

[ㄱ] 익히기 어렵다. 


INCLUDE Irvine32.inc


.data

Str_data byte "Hello world", 0

.code

main PROC

mov esi, offset Str_data

mov ecx, lengthof Str_data

L1:

mov eax, [esi]

call         WriteChar

call         crlf

add esi, type Str_data

loop         L1

exit

main ENDP

END main

'어셈블리' 카테고리의 다른 글

어셈블리 step_3_mov [대충정리 -> 차후 계속 수정]  (0) 2017.06.23
어셈블리어 STEP_1  (0) 2017.06.23
irvine 어셈블리 계산기  (0) 2017.06.18
irvine 어셈블리 사칙연산 (더하기)  (0) 2017.06.18
정수 입력  (0) 2017.06.18

INCLUDE Irvine32.inc


.data

prompt1 byte "value1 Input : ", 0

prompt2 byte "value2 Input : ", 0

prompt3 byte "choice Input : ", 0

value1 dword 0

value2 dword 0

cho_ dword 0

.code

main PROC

; 정수_1 입력

mov edx, offset prompt1

call WriteString

call Readint

mov value1, eax


; 정수_2 입력

mov edx, offset prompt2

call WriteString

call Readint

mov value2, eax


mov edx, offset prompt3

call WriteString

call Readint

mov cho_, eax

call WriteDec

call crlf


.IF cho_ == 1

call Addnum

.ELSEIF cho_ == 2

call Minus

.ELSEIF cho_ == 3

call Multi

.ELSEIF cho_ == 4

call Diven

.ENDIF

exit

main ENDP


Addnum PROC

mov eax, value1

add eax, value2

call WriteInt

call crlf

exit

Addnum ENDP


Minus PROC

mov eax, value1

sub eax, value2

call WriteInt

call crlf

exit

Minus ENDP

Multi PROC

mov eax, value1

imul eax, value2

call WriteInt

call crlf

exit

Multi ENDP

Diven PROC

xor edx, edx

mov eax, value1

mov ebx, value2

div ebx

call DumpRegs

call crlf

exit

Diven ENDP 

END main


[ you need to zero extend your EDX register before doing the division: 


'어셈블리' 카테고리의 다른 글

어셈블리어 STEP_1  (0) 2017.06.23
어셈블리 + irvine + 문자 출력  (0) 2017.06.22
irvine 어셈블리 사칙연산 (더하기)  (0) 2017.06.18
정수 입력  (0) 2017.06.18
XOR  (0) 2017.06.02

INCLUDE Irvine32.inc


.data

prompt_1 byte "input num1 : ", 0

prompt_2 byte "input num2 : ", 0

prompt_3 byte "choice num : ", 0

Operator_ byte "[1] Addition", 0dh, 0ah


num1 dword 0 

num2 dword 0 

ch_ dword 0 

.code 

main PROC

mov edx, offset prompt_1

call WriteString

call Readint 

mov num1, eax


mov edx, offset prompt_2

call WriteString

call Readint

mov num2, eax


mov edx, offset prompt_3

call WriteString

call Readint

mov ch_, eax


.IF ch_ == 1

call Addnum

.ENDIF


exit

main ENDP

Addnum PROC

mov eax, num1

add eax, num2

call WriteInt

call crlf


exit

Addnum ENDP

END main

'어셈블리' 카테고리의 다른 글

어셈블리 + irvine + 문자 출력  (0) 2017.06.22
irvine 어셈블리 계산기  (0) 2017.06.18
정수 입력  (0) 2017.06.18
XOR  (0) 2017.06.02
shell code  (0) 2017.05.07

정수 입력

어셈블리2017. 6. 18. 12:00

/* 살펴볼 부분 Readint */

TITLE Readint

INCLUDE Irvine32.inc


.data

prompt byte "정수 입력 : ", 0

nData dword 0

.code

main PROC

mov edx, offset prompt 

call WriteString

call Readint

mov nData, eax

call WriteDec

call crlf

exit

main ENDP

END main



-------------------------------------------------------------------------------------

[assembly -> c언어]


# include <stdio.h>

int main(void)

{

char *s = "정수 입력 : ";

int nData = 0;

printf("%s", s);

scanf("%d", &nData);

printf("%d \n", nData);

return 0;

}

'어셈블리' 카테고리의 다른 글

irvine 어셈블리 계산기  (0) 2017.06.18
irvine 어셈블리 사칙연산 (더하기)  (0) 2017.06.18
XOR  (0) 2017.06.02
shell code  (0) 2017.05.07
Irvine 설치 방법  (0) 2017.05.07

XOR

어셈블리2017. 6. 2. 15:17

====================================================

# include <stdio.h>


int main(void) {

int nData = 0;

__asm {

mov eax, 10;

mov ebx, 13;

xor eax, ebx;

mov nData, eax;

}

printf("%d \n", nData);

return 0;

}

====================================================

INCLUDE Irvine32.inc


.data

prompt byte "데이터 입력 : ", 0

step_1 DWORD 0

step_2 DWORD 0

step_3 DWORD 0

.code

main PROC

mov edx, offset prompt

call WriteString

call ReadInt

mov step_1, eax

call WriteDec

call crlf

xor eax, 4h


mov step_2, eax

call WriteDec

call crlf

xor eax, 4h


mov step_2, eax

call WriteDec

call crlf


exit

main ENDP

END main

'어셈블리' 카테고리의 다른 글

irvine 어셈블리 사칙연산 (더하기)  (0) 2017.06.18
정수 입력  (0) 2017.06.18
shell code  (0) 2017.05.07
Irvine 설치 방법  (0) 2017.05.07
버퍼 오버플로우 공격  (0) 2017.05.02

shell code

어셈블리2017. 5. 7. 19:35

#include <stdio.h>

#include <string.h>

 

char *shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"

 "\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";


int main(void)

{

fprintf(stdout,"Length: %d\n",strlen(shellcode));

(*(void(*)()) shellcode)();

return 0;

}

'어셈블리' 카테고리의 다른 글

정수 입력  (0) 2017.06.18
XOR  (0) 2017.06.02
Irvine 설치 방법  (0) 2017.05.07
버퍼 오버플로우 공격  (0) 2017.05.02
irvine  (0) 2017.05.01

http://moomini.tistory.com/80

'어셈블리' 카테고리의 다른 글

XOR  (0) 2017.06.02
shell code  (0) 2017.05.07
버퍼 오버플로우 공격  (0) 2017.05.02
irvine  (0) 2017.05.01
인라인 어셈블리 sub  (0) 2017.05.01

/*buffer overflow*/

# include <stdio.h>


int main(void)

{

char n[][6] = { "hello", "world" };

/*

   n[ㄱ][ㄴ] ; ㄱ : index // ㄴ : length

*/

printf("n[0] => %s   n[1] => %s\n", n[0], n[1]);

printf("step_1 ++++++++++++++++++++++ \n");

n[0][strlen(n[0])] = 'y'; // step_1

printf("n[0] => %s   n[1] => %s\n", n[0], n[1]);


printf("step_2 ++++++++++++++++++++++ \n");

n[0][strlen(n[0])-1] = 'z'; // step_2

printf("n[0] => %s   n[1] => %s\n", n[0], n[1]);

return 0;

}




'어셈블리' 카테고리의 다른 글

shell code  (0) 2017.05.07
Irvine 설치 방법  (0) 2017.05.07
irvine  (0) 2017.05.01
인라인 어셈블리 sub  (0) 2017.05.01
인라인 어셈블리 add  (0) 2017.05.01