CS 39

[컴퓨터 구조](17)[버퍼 오버플로우]

버퍼 오버플로우: 할당된 메모리 공간을 넘어 데이터를 쓰는 상황    배열 범위를 초과하는 데이터 쓰기: A[10]에 길이가 15인 데이터를 쓰면 Bof    잘못된 입력 검증: 사용자가 예상보다 큰 데이터를 입력한 경우 스택 기반 버퍼 오버플로우를 이용한 공격    너무 큰 데이터를 넣어 데이터 저장 장소에 인접한 메모리까지 침범(리턴 주소 등)할 수 있다    따라서 공격자는 리턴 주소를 공격자 코드가 있는 곳으로 조작해 공격받도록 한다.    예) 크기가 40byte인 버퍼에 쓰레기값 40byte, 공격 코드가 있는 곳의 리턴 주소, 공격 코드를 넣어 리턴주소를 덮어쓰고 반환될 때 공격 위치로 가서 공격 실행    주의사항공격코드나 리턴주소를 넣을 때, INTEL등의 little endian 메모리..

CS/컴퓨터 구조 2025.01.31

[컴퓨터 구조 번외](2)[어셈블리 문제 풀어보기 2]

문제void switcher(long a, long b, long c, long *dest){ long val; switch(a){ case -(1)-: c = -(2)-: case -(3)-: val = -(4)-; break; case -(5)-: case -(6)-: val = -(7)-; break; case -(8)-; val = -(9)-; break; default: val = -(10)-; } *dest = val;}라는 c 코드가 있다. 위를 어셈블리어로 바꾼다면// a in %rdi, b in %rsi, c in %rdx, pointer** dest in %rcxswticher: cmpq $7, %rdi ja .L2 jmp *.L4(, %rdi, 8)..

CS/컴퓨터 구조 2025.01.30

[컴퓨터 구조 번외](1)[어셈블리 문제 풀어보기 1]

시험 끝난 기념 번외 (어셈블리 문제 풀어보기)문제long P[M][N];long Q[N][M];long sum_element(long i, long j){ return P[i][j] + Q[j][i];}이고,// i in %rdi, j in %rsisum_element:leaq 0(, %rdi, 8), %rdxsubq %rdi, %rdxaddq %rsi, %rdxleaq (%rsi, %rsi, 4), %raxaddq %rax, %rdimovq Q(, %rdi, 8), %raxaddq P(, %rdx, 8), %raxret라 컴파일 되었을 때, M, N의 값은? 해답- %rdx = 8*rdi = 8*i- %rdx = %rdx - %rdi = 8i-i = 7i- ..

CS/컴퓨터 구조 2025.01.29

[컴퓨터 구조](16)[어셈블리어 7]

배열: 같은 자료형의 자료를 모은 자료구조예) int A[2]; 이때 A = &A[0]으로 쓰일수도 있다.-> 메모리에서 연속적으로 저장되어있음예) int A[3]; -> 메모리에 4바이트 int형 자료가 3개 저장되어있음. 각각 자료 시작 주소 = A, A+4, A+8 이다. 총 배열의 크기 = 4*3 = 12바이트 어셈블리의 배열 처리완전 메모리 어드레싱으로 처리예) a = A[3]; 처리하기    rsi에 int 배열 A의 시작주소가 들어 있을때    movq $3, %rdi    movq (%rsi, rdi, 4), %rax -> A+4*3에 있는 값 받아와 rax에 저장 -> rax에 A[3]저장 어셈블리의 다차원 배열행 우선 방식으로 메모리에 저장 후 처리예시) {{1,2,3},{4,5,6}}..

CS/컴퓨터 구조 2025.01.28

[컴퓨터 구조](15)[어셈블리어 6]

스택 프레임: 함수가 호출될 떄 할당되는 스택 영역리턴 정보로컬 저장소 (필요하면 씀): 함수 내에서 선언된 지역변수 저장임시 공간 (필요하면 씀): 계산 중간값, 최적화를 위한 임시 데이터, 반환값 등%rbp: 스택 프레임의 끝 주소 저장(%rbp ~ %rsp사이가 현재의 스택 프레임)만약 레지스터가 모자르다면 여기에 값 저장하기도 한다.레지스터 저장 규칙caller saved: 호출하는 쪽에서 값을 저장할 의무caller는 콜하기 전 그 스택 프레임에 임시값 저장, 이후 callee가 복귀하면 임시값 복원%rax, %rdi, %rsi... 등이 caller saved 레지스터callee savedcallee는 함수 실행 전 프레임에 임시 값 저장 후 caller로 복귀 전 값 복원 후 return%r..

CS/컴퓨터 구조 2025.01.27

[컴퓨터 구조](14)[어셈블리어 5]

프로시저제어권 전달 프로시저 코드의 시작 리턴 지점으로 돌아가기데이터 전달 매개변수, 리턴 값 등메모리 관리 프로시저 실행 중 할당 리턴할 때 저장소(스택) 반납스택먼저 들어간 것이 나중에 나오는 메모리 구조스택은 메모리 주소가 작은 방향으로 성장한다%rsp 레지스터는 스택의 top주소를 저장한다 (가장 최근에 저장된 값의 주소 저장됨)PUSH S: 스택에 S를 저장한다 %rsp = %rsp-8 S -> (%rsp)POP D: 스택에서 하나를 빼서 D에 저장한다. (제일 나중에 들어온 것을 D에 저장) (%rsp) -> D %rsp = %rsp+8프로시저 CALL 스택에 리턴 주소(호출된 장소) push 호출받은 함수로 jump프로시저 ret 스택에서 리턴 주소를 pop ..

CS/컴퓨터 구조 2025.01.24

[컴퓨터 구조](13)[어셈블리어 4]

점프 명령어(조건 분기): 조건(플래그)에 따라 코드 다른 부분으로 이동jmp: 무조건 이동je / jne: ZF 값이 1 / 0 이면 이동js/ jns: SF 값이 1 / 0 이면 이동jg / jge: 비교 연산의 결과가 크다 / 크거나 같으면 이동jl / jle: 비교 연산의 결과가 작다 / 작거나 같으면 이동ja / jb: 비교연산의 결과가 크다 / 작다goto 명령어C언어에서 지정된 레이블로 이동레이블은 위에서 아래로 쭉 실행 하지만 goto를 만나면 이동나중에 어셈블리어로 번역할 때, 플래그, 점프 명령어 등으로 구현됨if문 -> goto문if문if (x>y) result = y-x;else result = y-x;goto문 if (x>y) goto Else; result = x-y; ..

CS/컴퓨터 구조 2025.01.23

[컴퓨터 구조](12)[어셈블리어 3]

플래그 레지스터: 연산 결과에 따라 0or1의 값을 가지는 1비트의 레지스터ZF (zero flag): 연산의 값이 0이면 1예시) xorq rax, rax (rax = 0이 됨) -> ZF = 1CF (carry flag): (비부호형에서) 연산의 값이 비트의 범위를 벗어나면 1예시) 1111(15) + 0001(1) = 10000(16) -> CF = 1SF (sign flag): (부호형에서) 연산의 결과가 음수면 1예시) 0001(1) + 1110(-2) = 1111(-1) -> SF = 1OF (overflow flag): (부호형에서) 연산의 결과가 오버플로우면 1오버플로우 판단은 결과값의 맨 첫번째 비트랑 두번째 비트를 xor하고 1 나오면 오버플로우다.예시) 0111(7) + 0001(1)..

CS/컴퓨터 구조 2025.01.22

[컴퓨터 구조](11)[어셈블리어 2]

완전 메모리 어드레싱 모드앞에서 사용했던 (%rax)꼴의 확장D(Rb, Ri, S) = (Rb + S*Ri+D)이다.D: 상수(1, 2, 4 중 하나)Rb: 기본 레지스터Ri: 인덱스 레지스터S: 규모 (1,2,4,8 중 하나)예시) movq 2(%rax, %rcx, 4), %rdxrax+4*rcx+2인 메모리 주소에 있는 값을 rdx에 넣어라LEA 연산(lea S D: S(주소 형태)의 값을 D에 넣어라)S는 주소 모드 표현이어야 한다. (%rax)꼴. 단순 상수나 레지스터의 값은 안됨.($0x0103이나 %rax는 안됨)예시) leaq (%rax) %rcx = rcx에 rax의 값을 넣어라.S가 주소 형태이긴 한데, 메모리 접근은 하지 않는다예시) leaq (%rax, %rcx) %rdx = 마치 r..

CS/컴퓨터 구조 2025.01.21

[컴퓨터 구조](10)[어셈블리어 1]

어셈블리의 데이터 형식1, 2, 4, 8 바이트의 정수형 데이터데이터 값, 주소4, 8, 10 바이트의 부동소수점 데이터배열이나 구조체 같은 형태 없이 메모리 상에 연속으로 할당됨어셈블리의 연산레지스터 or 메모리 데이터에 대한 산술 기능 수행메모리와 레지스터 사이 데이터 전송전송 통제: 프로시저로 점프, 조건부 분기x86-64의 정수 레지스터 (64비트 길이)%rax%rbx%rcx%rdx%rdi%rsp: 특수 용도 레지스터라 보통 계산에 사용 안함%rbp%r8, %r9 ... %158바이트이지만, 하위 4바이트, 2바이트에 참조 가능 (예전 프로그램과 호환성)어셈블리의 데이터 이동피연산자 형식 (AT&T문법)상수 정수 데이터: 숫자 앞에 $를 붙임예시) $0x3A65, $-533레지스터: 16개의 정수..

CS/컴퓨터 구조 2025.01.20
728x90