전체 글(333)
-
[11] 어셈블리 argc, argv 이해하기
1. main함수의 인자 포인터 배열 : 주소를 원소로 하는 배열배열 포인터 : 배열을 가리키는 포인터 [ 사용법 ] int main( int argc, char *argv[] ){printf("%s \n", argv[1] ); // argv[1] 은 주소이다 !return 0; // 실행파일의 첫번째 인자의 주소 !} // argv[0] 은 실행파일의 이름임=>실행결과 #./a.out hello hello *argv[] : 포인터 배열 ( 인자들이 주소 ) ebp+8 : argc : 인자의 개수, 즉 *argv[]배열의 인자 개수ebp+12 : argv[] : 실행파일의 이름이 들어있다ebp+16 : argv[1] : 실행파일의 첫번째 인자의 주소값(포인터)이 들어있다ebp+20 : argv[2] : ..
2017.10.30 -
[10] 어셈블리 스택메모리를 이용한 변수 저장 및 사용
http://itsaessak.tistory.com/249 는 스택메모리를 사용하지 않고 bss section을 이용했습니다다. 더 쉬운 버전이니 참고하길 바랍니다 [ 어셈블리 코드 ] - 문자를 입력하면, 거꾸로 출력되어 진다 extern scanf extern printf section .data prompt_str db '%s',00 print_chr db '%c',00 print_new db 10,00 section .text global main main: push ebp mov ebp, esp ; function epilogue sub esp, 1028 ; 지역변수 공간 할당 1028 byte lea eax, [ebp-1024] ; eax에는 ebp-1024 주소값이 입력 push eax pu..
2017.10.27 -
[9] 어셈블리 스택 메모리를 이용한 간단한 덧셈 ( leave, ret, call )
C언어 코드를 어셈블리코드로 표현하자 [ C언어 코드 ] int sum( int a, int b ){ int sum = 0 ; sum = a + b ; return sum ; } int main(){ int a = 10; int b = 20; int ret = 0; ret = sum(a,b); printf("Sum : %d\n",ret ); return 0 ; } [ 어셈블리 코드 ] extern printf section .dataprompt_hex: db '0x%08x',10,00prompt_int: db '%d',10,00prompt_sum: db 'Sum is : %d',10,00section .textglobal mainsum:push ebpmov ebp, esp ; function prolog..
2017.10.27 -
프로세스의 메모리 구조 ( + ESP, EBP )
[root@EH 3797]# cat maps 00000000-08048000 사용하지 않는 메모리 주소 08048000-08049000 r-xp 00000000 03:01 425373 /root/a.out : 1000 , 4096byte ,4K: text section - 코드가 위치하는 주소 08049000-0804a000 rw-p 00000000 03:01 425373 /root/a.out : 1000 , 4096buyr ,4K: data section( data,bss,heap ) - 전역변수, 힙 공간 등의 주소 08xxxxxx ~ 40xxxxxx : HEAP 영역을 위한 예약된 영역 40xxxxxx : 공유라이브러리영역 40000000-40013000 r-xp 00000000 03:01 3101..
2017.10.25 -
[8] 어셈블리 반복문 연습
C언어 반복문을 어셈블리로 직접 작성해보자 [ C언어 ]- 문자열의 끝을 파악해서 문자개수를 세고, 문자열의 뒤에서부터 출력한다 str buffer[1024] ; int index ; int i=0 ; int main(){ scanf("%s",string); while( string[i] != null ){ i++; } index--; for( i=index; i >= 0 ; i-- ){ printf("%c",string[i]); } printf("\n"); return 0; } [ 어셈블리 ] str string[1024]; int index; int i=0; scanf("%s",string); while( string[i] != null ){ i++; } index = i; while( i < 0 )..
2017.10.24 -
[7] 어셈블리 분기문 ( if, switch ) +cmp, jmp
1. cmp ( compare )레지스터나 메모리의 값을 변경하지 않는다플래그 레지스터에만 영향을 준다 ( flag register - 상태 레지스터 )-> SF(부호), CF(올림수), ZF(0,두개의 비교값이 같을 때 ) # 두 피연산자의 비교 ( CMP )cmp eax, ebx=> eax-ebx => 결과가 0인 경우: 같은 경우 => SF:0, CF:0, ZF : 1=> 결과가 음수인 경우 : eax SF:1 , CF:0, ZF: 0=> 결과가 양수인 경우 : eax > ebx => SF:0, ZF:0 , CF:0 0번이 시작7번 플래그() - SF 6번 플래그() - ZF cmp 10, 201 0 000111SF ZF cmp 10,100 1 000110SF ZFcmp 20,100..
2017.10.23 -
정보보안기사 실기 참고 내용 정리 3
1. 피싱 vs 파밍# 피싱전자우편이나 메신저 등을 이용해서 신뢰할 수 있는 사용자나 기업이 전송한 메시지인 것처럼 가장하여 개인정보를 빼내는 공격기법이다 # 파밍사용자의 컴퓨터를 악성코드에 감염시켜 정상 홈페이지에 접속하여도 피싱 사이트로 유도된다( DNS 서버의 응답을 대신하여 사용자의 컴퓨터에 피싱사이트의 IP주소로 응답한다 ) 2. 체스트안드로이드 악성코드로써, SMS로 전송된 인증번호를 이용하는 소액결제 방식의 허점을 악용한다① 사용자가 SMS에 링크 형식으로 포함된 악성코드를 다운로드한다② 해당 스마트폰은 좀비 스마트폰이 된다 ( 결제 사이트의 SMS가 사용자가 아닌 공격자에게로 전송된다 )③ 공격자는 체스트로 얻은 정보를 이용해서 소액결제를 시도한다④ 소액결제 사이트의 인증번호가 공격자에게 ..
2017.10.23 -
[6] 어셈블리 비트연산 ( shift, and, or, not )
1. 비트 연산 ( Shift 연산 )1-1. 부호가 없는 연산 shl : 왼쪽으로 이동shr : 오른쪽으로 이동 1-2. 부호가 있는 연산 sal : 왼쪽으로 이동sar : 오른쪽으로 이동 [ C언어에서 shift 연산 ]int eax=4;eax neg 명령어로 사용한다 부호를 변경할때 사용한다 mov eax, 15 neg eax=> eax 레지스터에는 -15가 저장되어 있다 나눗셈에서의 shift 연산 활용 mov eax, 0 ; eax 레지스터 초기화 mov ax, 10 ; ax 레지스터( 16bit ) 에 10 입력 mov dl, 4 ; dl 레지스터 ( 8bit ) 에 4 입력 div dl ; ax 레지스터 / dl 레지스터 : 16bit / 8bit => AH(나머지):AL(몫) shr ax,..
2017.10.20 -
[5] 어셈블리 계산기 , scanf , printf
어셈블리 ( NASM ) 언어로 간단한 계산 작업을 할 수 있는 계산기 코드를 작성해보도록 하겠습니다 [ 계산기 작성 코드 ] extern printf ; printf 라이브러리 가져온다 extern scanf ; scanf 라이브러리 가져온다 section .data argv: db '%d\n', 10, 00 argv1: db '%d %d', 10, 00 argv2: db '%d %d', 10, 00 argv3: db 'q:%d, r:%d', 10, 00 section .bss num_1: resd 1 ; 레이블 num_1 : 0x85858585 같은 메모리의 주소값 num_2: resd 1 ; 레이블 num_2 : 0x85858585 같은 메모리의 주소값 section .text global main..
2017.10.19 -
[4] 어셈블리 명령어 add,sub,mul,div
1-1> 덧셈: ADD 1-2> 뺄셈: SUB [ 덧셈 ] [ 코드 설명 ] main: mov dword [sum], 10 ; sum = 10 add dword [sum], 20 ; sum = sum + 20 push dword [sum] push argv1 call printf ; printf("%d",30) 뺄셈은 덧셈과 같은 형식으로 사용한다 1-3> 곱셈 MUL : unsigned(부호가 없는 연산) # 부호 없는 al, ax, eax 레지스터 의 값을 피연산자와 곱한다 # 형식 : mul register|memory # 원리 AL(8) * 8bit x/m -> AX ( 16bit ) AX(16) * 16bit x/m -> DX:AX ( 16bit 레지스터 2개를 사용한다 ) EAX(32) * 3..
2017.10.18