본문 바로가기
반응형

프로그래밍194

[SYSTEM HACKING] 어셈블리 반복문( jmp ) 어셈블리 반복문( jmp )에 대해서 정리한다. 반복문 : for, while, do-while - 어셈블리에서 분기문과 반복문의 차이는 jmp를 이용해서 코드를 반복 시켜주느냐 마느냐의 차이이다. // for문int i; for(i = 0; i 2017. 10. 24.
[SYSTEM HACKING] 어셈블리 분기문( compare<cmp>, jump<jmp> ) 어셈블리 분기문( compare, jump )에 대해서 정리한다. 분기문: if, switch 1. cmp: compare - 레지스터나 메모리의 값을 변경하지 않는다. - 플래그 레지스터에만 영향을 준다. - SF,CF, ZF - cmp left, right ( 문서를 통해서 참조한 EFLAGS Register의 형태이다... ) ! 두 피연산자의 비교 left - right ( SUB 명령어와 같이 빼기 연산을 하고 그 결과에 따라서 플래그에 영향을 미치게 된다.. ) 1). 결과가 0인 경우: 같은 경우 - ZF: 1, SF:0 2). 결과가 음수인 경우: right가 더 큰 경우 - ZF: 0, SF: 1 3). 결과가 양수인 경우: left가 더 큰 경우 - ZF:0, SF: 0 ( cmp 명령.. 2017. 10. 23.
[SYSTEM HACKING] 어셈블리 명령어( shift 연산<shl, shr, sal, sar>, 논리연산<and, or, not>, 형변환<movzx, movsx>) 어셈블리 명령어( shift 연산, 논리연산, 형변환)에 대해서 정리한다. 1. 컴파일 과정 2. 실행중인 프로세스의 메모리 구조 3. 어셈블리 프로그래밍: 사칙연산 --------------------------------------------- 1. 비트연산: shift 연산 1). 부호가 없는 연산 ( Logical Shift ) - 왼쪽으로 이동: shl - 오른쪽으로 이동: shr ex). eax = 4; eax al * 큰 -> 작은 크기로 이동하는 상황은 특정 명령어가 존재하지 않고 메모리나 레지스터의 해당 크기를 줄여서 그 크기 만큼의 값만 가지고 온다. 대신에 이 경우에는 상위 비트의 값을 잃게 되므로 값의 손실이 생길 수 있다!!! [실습] - 사칙연산 프로그램 작성 - 입력 최대크기는.. 2017. 10. 21.
[SYSTEM HACKING] 어셈블리 사칙연산 명령어( add, sub, mul, imul, div, idiv ) / 계산기 만들기 실습 어셈블리 사칙연산 / 계산기 만들기 실습에 대해서 정리한다. 1. 사칙연산: +, -, *, / * 어셈블리에서 나머지를 구하는 연산은 없다. 1). 덧셈: ADD ( 어셈블리에서 + 이용해서 연산을 하는 경우는 Effective Address의 주소 연산을 할 경우에 [ ] 안에서만 사용하고더하기 연산 기능은 add 명령어를 통해서 하게 된다.. ) 2). 뺄셈: SUB 3). 곱셈 - MUL( unsigned ) * 피연산자는 하나이고 곱셈을 해서 eax와 edx 레지스터에 저장한다. - IMUL( signed ) * 피연산자가 1부터 3개까지 올 수 있고 형식은 MUL과 똑같다. ( unsigned의 곱하기 연산을 할 경우에는 mul을 사용한다 ) ( signed의 경우에는 IMUL 명령어를 이용하.. 2017. 10. 20.
[C언어] 문자열 자르기( strtok() ) / 문자열과 숫자 서로 변환하기 ( atoi(), strtol(), atof(), strtof() ) / 회문 판별, N-gram 만들기 문자열 자르기( strtok() ) / 문자열과 숫자 서로 변환하기 ( atoi(), strtol(), atof(), strtof() ) / 회문 판별, N-gram 만들기에 대해서 정리한다. 문자열 자르기 - strtok(대상문자열, 기준문자); ( 기준문자는 "(큰 따옴표)로 묶어준다 ) - 헤더 파일에 정의되어 있다. - strtok() 함수는 자른 문자열을 NULL로 채운다. ( 더이상 자를 문자열이 없으면 NULL을 반환한다 ) * 자른 문자열을 NULL로 채우기 때문에 반복해서 문자열을 자르는 작업을 하려면 반복문을 이용해서 strtok() 함수를 사용할때 대상문자열을 NULL로 준다. * strtok() 함수를 이용해서 문자열을 자르면 원본 문자열을 변환하기 때문에 사용에 주의한다. 문자열 .. 2017. 10. 19.
[SYSTEM HACKING] 명령어( mov, lea ) 명령어( mov, lea )에 대해서 정리한다. ! 데이터를 저장할 수 있는 곳 - 메모리 - 레지스터 - 코드섹션 명령어 1. mov - 할당 연산자와 비슷한 개념 - mov dst, src ! 피연산자 dst, src가 둘 모두 메모리가 올수는 없다. !! 코드섹션에서 메모리를 사용할때는 주소에 대한 메모리의 크기를 명시해준다. ( 주소에 대한 메모리의 크기를 명시해주지 않으면 nasm은 해당 주소의 크기를 data 혹은 bss 섹션에 정의해놔도 코드를 실행할때는 알지 못한다 ) * 레지스터의 크기는 이름으로 알 수 있지만 메모리는 이름으로 크기를 알 수 없다. * 코드 섹션에 mov 명령어를 사용할 때 피연산자로 레이블 이름을 그대로 적어주고 상수 값을 주는건 피연산자로 상수, 상수를 주는것과 같기.. 2017. 10. 18.
[SYSTEM HACKING] NASM ( 문자, 문자열 ) / data, bss, text segment에서의 데이터 표현 / 레지스터( Register ) NASM ( 문자, 문자열 ) / data, bss, text segment에서의 데이터 표현 / 레지스터( Register )에 대해서 정리한다. C 언어 - 문자: '(작은 따옴표) - 문자열: "(큰 따옴표) - 'hello'(x), 'h'(o) - "hello"(o), "h" NASM - 문자, 문자열: '(작은 따옴표) * 어셈블리어는 문자와 문자열을 구분하지 않는다. - 어셈블리어는 NULL 문자가 자동으로 붙지 않기 때문에 따로 붙여줘야 한다. * 이스케이프 문자가 지원되지 않는다면 ASCII 코드 값을 넣어주면 된다. ( nasm 홈페이지에 문서를 참조하면 String Constants 부분에 문자에 대한 표현 방법이 자세하게 나와있다 ) ( C언어 같은 경우에는 NULL 문자가 자동으로 .. 2017. 10. 17.
[C언어] 문자열 길이(strlen()) / 비교하기(strcmp()) / 복사하기(strcpy()) / 붙이기(strcat()) / 만들기(sprintf()) / 검색(strchr(), strrchr(), strstr()) 문자열 길이 구하기(strlen()) / 비교하기(strcmp()) / 복사하기(strcpy()) / 붙이기(strcat()) / 만들기(sprintf()) / 검색(strchr(), strrchr(), strstr())에 대해서 정리한다. 문자열 길이 구하기 - 문자열 길이를 구할때는 strlen(문자열포인터) 혹은 strlen(배열) 형식을 사용한다. ( 헤더 파일에 정의되어 있다 ) * strlen() 함수를 이용해서 문자열의 길이를 구할때는 NULL은 길이에 포함하지 않는다. ( strlen()을 이용한 문자열 길이는 NULL 바로 앞까지의 길이를 구하는 것이다 ) 문자열 비교하기 - strcmp(문자열1, 문자열2) 형식을 사용해서 두 문자열이 같은지를 비교한다. ( 헤더 파일에 정의되어 있다 .. 2017. 10. 17.