어셈블리 step_3_mov [대충정리 -> 차후 계속 수정]
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 }
(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 |
어셈블리어 STEP_1
[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/]
등이 있다고 한다.
================================================
어셈블리어
장점
[ㄱ] 프로그램의 실행 속도가 매우 빠르다.
[ㄴ] 프로그램의 크기가 매우 작다.
[ㄷ] 어떤 프로그램이라도 만들수 있다.
등등등
================================================
단점
[ㄱ] 익히기 어렵다.
'어셈블리' 카테고리의 다른 글
어셈블리어_TEST (0) | 2017.06.23 |
---|---|
어셈블리 step_3_mov [대충정리 -> 차후 계속 수정] (0) | 2017.06.23 |
어셈블리 + irvine + 문자 출력 (0) | 2017.06.22 |
irvine 어셈블리 계산기 (0) | 2017.06.18 |
irvine 어셈블리 사칙연산 (더하기) (0) | 2017.06.18 |
어셈블리 + irvine + 문자 출력
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 |
irvine 어셈블리 계산기
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 |
irvine 어셈블리 사칙연산 (더하기)
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 |
/* 살펴볼 부분 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 |
====================================================
# 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
#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 |
Irvine 설치 방법
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 |