System hacking Background

don't panic·2023년 9월 21일
0

systemhacking study

목록 보기
2/4

Computer Architecture

범용 레지스터

이름용도
rax함수의 반환 값
rbxx64에서는 주용도 없음
rcx반복문의 반복 횟수, 각종 연산의 시행 횟수
rdxx64에서는 주된 용도 없음
rsi데이터를 옮길 때 원본을 가리키는 포인터
rdi데이터를 옮길 때 목적지를 가리키는 포인터
rsp사용중인 스택의 위치를 가리키는 포인터
rbp스택의 바닥을 가리키는 포인터

세그먼트 레지스터

cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재.

명령어 포인터 레지스터

CPU가 어느 부분의 코드를 실행할 지 가리키는 역할.
rip : 크기는 8바이트

플래그 레지스터

  • 프로세서의 현재 상태를 저장하고 있는 레지스터
플래그의미
CF (Carry Flag)부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정된다.
ZF (Zero Flag)연산의 결과가 0일 경우 설정 된다.
SF (Sign Flag)연산의 결과가 음수일 경우 설정 된다.
OF (Overflow Flag)부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정 된다.

레지스터 호환


Linux Memory Layout

  • 메모리 오염과 관련된 취약점:
    • Stack Buffer Overflow
    • Format String Bug
    • Use after Free
    • Double Free Bug

세그먼트


x86 Assembly

x86-64 어셈블리어 문법 구조

opcode operand1 operand2
=operand1operand2opcode해라

명령어

명령 코드
데이터 이동mov. lea
산술 연산inc, dec, add, sub
논리 연산and, or, xor, not
비교cmp, test
분기jmp, je, jg
스택push, pop
프로시져call, ret, leave
시스템 콜syscall

피연산자

  • 상수
  • 레지스터
  • 메모리

Opcode: 스택

push val

  • val을 스택 최상단에 쌓음

결론적으로 rsp-=8을 하고, [rsp]=val인 셈임

pop reg

  • 스택 최상단의 값을 꺼내서 reg에 대입

결론적으로 rsp+=8을 하고 reg=[rsp-8]인 셈임

Opcode: 프로시저

프로시저를 부르는 행위를 호출(Call)이라고 부르며, 프로시저에서 돌아오는 것을 반환(Return)이라고 부른다.

  • 프로시저를 호출할 때는 프로시저를 실행하고 나서 원래의 실행 흐름으로 돌아와야 하므로, call 다음의 명령어 주소(Return address)를 스택에 저장하고 프로시저로 rip를 이동시킨다.

call addr

  • addr에 위치한 프로시저 호출
push return_address
jmp addr

leave

  • 스택프레임 정리
mov rsp, rbp
pop rbp

ret

  • return address로 반환
pop rip

0개의 댓글

관련 채용 정보