1. 프로세스 메모리 구조
1-1. 스택의 구조
#스택 프레임 저장 내용
- 복귀 주소 (return address) : 호출한 프로그램 내에서 호출된 함수의 바로 다음 번지의 명령어(=호출 함수가 끝나고, 되돌아와야 하는 다음 명령어의 instruction pointer)
- 이전 프레임 포인터(saved frame pointer / old frame pointer) : 최상단 스택 프레임에서 바로 이전 단계의 스택 프레임의 시작점으로 이동할 때 필요한 주소 값 저장
- 지역변수
**local variable vs global variable**
in stack, in function vs in data/heap, in program
#main() -> foo() -> bar() 순으로 함수 호출 시 프로세스 메모리 구조
foo() 함수 호출될 때?
bar() 함수 호출될 때?
bar() 반환될 때?
foo() 반환될 때?
2. 버퍼 오버플로우 공격 원리
기본 개념은 '메모리 덮어쓰기'
정상적인 경우에는 사용되지 않아야 주소 공간, 즉 원래는 덮어쓸 수 없는 부분에 해커가 임의의 코드를 덮어쓰는 것.
(프로그래머가 취약한 특정 함수를 사용해야 공격이 가능함)

비정상적인 길이의 문자열 입력 -> segmentation falut 발생하여 비정상적으로 종료
복귀 주소 값을 쉘 코드의 시작 주소로 변경 -> 쉘 코드 실행 공격!
https://blog.naver.com/wnrjsxo/221262328135
버퍼 오버플로우 공격 - 스택 버퍼 오버플로우 공격
● 시스템 메모리의 구조 프로그램을 동작시키면 메모리에 프로그램이 동작하기 위한 가상의 메모리 공간이...
blog.naver.com
3. 버퍼오버플로우 대응 방안
#컴파일 시간 방어
- 마이크로소프트의 /GS 옵션
- 리눅스의 Canary
- 주소 공간의 랜덤화
- 문자열 길이를 체크하는 함수 사용
ex) strcpy 대신 strncpy 사용하기 - 컴파일러가 범위 검사를 강제로 수행하는 코드를 자동으로 삽입하는 프로그래밍 언어 사용
ex) python, java - Libsafe와 같은 안전한 라이브러리 사용
#실행 시간 방어
- 스택과 힙 영역에서 코드가 아예 실행되지 않도록 하는 방안(no execute)
- 주소 공간의 랜덤화(ASLR) : depence for ROP (BOF X)
#마이크로소프트 /GS 옵션
스택 영역과 데이터 영역에 쿠키(임의의 값)를 삽입
canary (linux) == stack cookie (windows)
=> 버퍼 오버플로우가 발생하면?
복귀 주소의 값은 물론 쿠키 값도 변조될 수 있다!
: 함수 종료 시 스택 영역의 쿠키와 데이터 영역의 쿠기 값이 다르면 변조가 이루어졌다고 판단 -> 오류 메시지 발생
4. ASLR
[Address Space Layout Randomization]
: 메모리 상의 공격을 어렵게 하기 위해서 스택이나 힙, 라이브러리 등의 주소를 랜덤으로 프로세스 주소 공간에 배치함으로써 실행할 때마다 데이터의 주소가 바뀌게 하는 기법 (segment 단위로 작동한다)
#ASLR 존재 이유
- 버퍼오버플로우
: 메모리에 악의적 데이터(악성코드)를 삽입하여 실행 - NX/DEP
(NX=Never eXecute)
(DEP= Data Execution Prevention)
: 데이터 실행 방지 -> 버퍼 오버 플로우 방어 - return oriented programming
: 삽입한 악성 데이터 곧바로 실행 X 메모리상에 흩어진 코드 조각 모아서 실행 - ASLR
:흩어진 코드(공유 라이브러리) 위치를 랜덤화 해서 알 수 없도록 함 -> ROP 방어!
https://bpsecblog.wordpress.com/2016/05/16/memory_protect_linux_1/
linux 환경에서의 메모리 보호기법을 알아보자(1)
지금부터 Linux 환경에서의 메모리 보호 기법에 대해 알아봅시다! 이번 편에서는 ASLR, NX, ASCII-Armor, Stack canary에 대해 알아보겠습니다. 위키를 통해 “메모리 보호”라는 말의 정의를 알아보고 넘
bpsecblog.wordpress.com
5. return oriented programming
stack과 함수 호출 형태 악용
- stack : 함수의 return 주소 저장
- 함수 : 실행 흐름의 분기 야기 -> 복귀할 주소 기억 필요
ROP( Return-oriented programming )는 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가 있는 상태에서도! 코드를 실행할 수 있게 한다.
- RTL + Gadgets
이 기법에서 공격자가 프로그램의 흐름을 변경하기 위해서
Stack Overflow 취약성 + 가젯(Gadgets)(: 해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어) 필요
- 각 가젯은 일반적으로 반환 명령어(ret)로 끝난다. 기존 프로그램 또는 공유 라이브러리 코드 내의 서브 루틴에 존재
- 가젯과 취약성을 사용하면 공격자가 임의의 작업을 수행 가능
https://www.lazenca.net/display/TEC/01.ROP%28Return+Oriented+Programming%29-x86
01.ROP(Return Oriented Programming)-x86 - TechNote - Lazenca.0x0
Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x86 ROP( Return-oriented programming )는 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가있는 상태
www.lazenca.net
+) 보충 자료 - 참고!!
https://shayete.tistory.com/entry/6-Return-Oriented-Programming
6. Return Oriented Programming (ROP)
6. python programming 관련 동영상입니다. 설명은 생략하도록 할게요. 필요하신 분은 참고하세요! python 바이너리 사용법은 ./python [port] 입니다. 7. ROP 6은 건너뛰고 왜 7이냐면, 중간에 python..
shayete.tistory.com
6. 어셈블리
#컴파일과 어셈블리의 관계
=> cpu 아키텍처마다 존재
- x86
- x64(64비트)
- ARM
- MIPS
- PPC
#Intel/AMD CPU (windows 운영체제 설치된 데스크톱)
x86/64
#ARM (안드로이드, 아이폰, 태블릿 등 Android/ios가 설치된 컴퓨터 시스템)
ARM/ARM64
#레지스터&기본 명령어
참고 - https://y0on-it.tistory.com/38
[윈도우][리버싱] 9주차 정리+어셈블리어
(애초에 프로그램이 별로 없다,,있긴 있음! ) 일반적인 리버싱의 목적 -소스코드 없이 남의 프로그램 분석할 때 -악성코드 행위 분석을 위해서 (실행 파일안에 코드가 있을 텐데 그게 어딨을까?!)
y0on-it.tistory.com
'스터디 > 해킹실습2' 카테고리의 다른 글
| [취약점 분석] 버퍼 오버플로우, Linux basics (0) | 2021.11.21 |
|---|---|
| [운영체제 보안] 컴퓨터 아키텍처 및 운영체제, 커널 아키텍처, 인터럽트, 시스템 콜, 프로세스, 보안 아키텍처, 리눅스 보안 (0) | 2021.11.01 |
| [암호 및 응용] 암호 알고리즘, 아스키코드, XOR, DES, AES, RSA, Diffi - Hellman 키 교환, 링크 암호화 vs 종단간 암호화 (0) | 2021.11.01 |
| [네트워크 보안] Dos 공격, Spoofing 공격 (0) | 2021.10.10 |
| [네트워크보안] HTTP, cookie, caching, DNS, soket programming (0) | 2021.10.03 |