본문 바로가기

System Hacking

(18)
9일차] 스택 메모리, 함수 1. 실행중인 프로세스의 전체 메모리 구조 알아보기. 스택 메모리 : 함수, 지역변수 1). sleep을 통해서 hello.c파일을 실행중인 파일로 만들어준다. 2). hello.c파일을 gcc 후에 실행하고 Ctrl+z를 통해 백그라운드를 시켜준다. 3). ps -ef | grep a.out을 통해서 PID를 알아낸다. 4) cd /proc/PID(836) 이때 PID는 다를 수 있다. 5) 해당 PID에서 cat maps파일을 보면 다음과 같이 스택메모리를 볼 수 있다. 6) 메모리 구조는 다음과 같이 할당되어 있다. 0x08048000-0x08049000 text section 0x08049000-0x0804a000 data section(.data .bss .heap) ~ deserved(heap..
8일차] 반복문(for, if) [ 반복문: for, while, do-while ] int i; for( i = 0; i < 10; i++){ printf("%d", i ); } int i = 0; while( i
7일차] 분기문(if, switch) [ cmp: compare ] - 레지스터나 메모리의 값을 변경하지 않는다. - 플래그 레지스터에만 영향을 준다. - SF(Sign Flag), CF(Carry Flag), ZF(Zero Flag) - cmp left, right ( left - right ) 1). 결과가 0인 경우 : 같다. ( ZF: 1, SF: 0 ) # 8번째 비트(SF)가 0, 7번째 비트(ZF)가 1인 것을 확인할 수 있다. # 지금 쓰고있는 체제에서는 flag를 확인할 수 있는 방법은 pushfd를 통해서 7번째비트(ZF)와 8번째비트(SF)를 확인해서 알아야 한다. 2) 결과가 음수인 경우: right가 더 큰 경우 ( ZF: 0, SF: 1 ) #8번째 비트(SF)가 1, 7번째 비트(ZF)가 0인것을 확인할 수 있다...
6일차] 비트연산자, 논리연산, 형변환 1. 비트연산: shift 연산 1). 부호가 없는 연산 - 왼쪽으로 이동: shl - 오른쪽으로 이동: shr ex). eax = 4 0000 0100 eax = eax 작은 -eax -> ax -> al
5일차] 연산자 (사칙연산) [ 사칙연산 ] 1. 덧셈: ADD # 먼저 sum에 10을 넣고, sum의 값고 20을 더하는 모습이다. # 레이블 a와 b에 10과 20을 넣고 둘이 더한 값을 sum에 넣는 모습이다. 2. 뺄셈: SUB # 뺄셈은 ADD와 별 다를 것이 없다. 같은 형식으로 사용하면 된다. 3. 곱셈 - MUL ( unsigned ) - 피연산자 1개 - IMUL ( signed ) - 1개~3개 # 상위 16비트만 사용하기 때문에 초기화 과정을 거쳐주어야 한다. # 이렇게하면 상위 16비트는 edx 하위 16비트는 eax에 저장된다. 따라서 추후에 비트연산을 통해서 확인해보면 된다. 4. 나눗셈 - DIV( unsigned ) - IDIV( signed ) [실습] - 두 정수를 입력받아서 덧셈, 뺌셈, 곱셈, ..
4일차] 명령어(mov, lea) [ mov ] - C언어의 assignment(=)할당 연산자와 비슷한 개념 - 기본적인 형태 : mov dst, src - ! dst, src 가 둘 모두 메모리가 올 수는 없다. -ex) # entry point의 eax레지스터에 10을 할당하고 있다. 메모리 할당부분인 num은 시작 주소값을 나타내고 있고 때문에 mov인자 값에 그대로 사용할 수 없다. 메모리할당을 위해 []를 해줘야 하며 어디까지인지 알 수 있게 dword 를 앞부분에 붙여주어야 한다. # 어셈블리에서 buffer 숫자배열과 문자열에 접근하는 방법을 알 수 있는 예제이다. double word 즉 dword이며 4바이트씩 차지하기때문에 +8을해야 30이라는 숫자를 출력할 수 있고, string인 'korea'는 1바이트씩움직이므로..
3일차] 각 메모리 공간의 데이터 표현 + 레지스터 C 언어의 문자표현 - 문자 : '(작은 따옴표) - 문자열 : " (큰 따옴표) - c언어에서는 엄격하게 구별한다. NASM의 문자표현 - 문자 'hello, World!!!', 10, 00 - 문자나 문자열 모두 '(작은 따옴표)으로 표현한다. - 즉, 'hello, world!!!'는 문자열 10은 \n 00은 null을 의미한다. - C언어로 표현하자면 "Hello, World!!!\n"; 와 같은 의미이다. - 변수라는 개념이 존재하지 않는다. NASM의 숫자표현 # 위에서 부터, 10진수, 16진수, 8진수, 2진수의 표현방식을 확인할 수 있다. 지금 이 nasm 문서는 2.대 major이기 때문에 실습하고 있는 환경에서 지원하지 않는 것도 있다. [ data segment에서 데이터를 표현 ..
2일차] 어셈블리 확인하기 [ 실행파일 구조 ] - 리눅스 : ELF - 윈도우즈 : PE - 유닉스 : COFF #> xxd hello.o // *xdd : 리눅스에서 제공하는 헥스뷰이다. [ 프로그램 & 프로세스 ] 1. 프로그램 - 실행중이지 않은 상태 - 디스크(보조 기억 장치)상에 파일 형태로 존재 2. 프로세스 (fore ground process 와 back ground process가 있다.) - 실행중인 상태 - 운영체제가 관리하는 작업의 단위 - 파일이 메모리(주 기억 장치)에 존재 [ 어셈블리어로 메모리 영역 이해하기. ] 1. text section(세그먼트) - 실행코드가 존재하는 영역 - 읽기전용 - 실행가능한 메모리 영역 - main 부분에 해당됨. 2. DATA 섹션(세그먼트) - 읽기/쓰기 가능한 메..