일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- tcache
- 보안뉴스
- nmcli
- 빅데이터분석기사 실기
- Python
- VS Code 오류
- mariadb
- AWS
- ubuntu
- [EduAtoZ]
- Cloud
- pwnable
- 인프런
- 워게임
- centos7
- 빅데이터 분석기사
- pandas
- Linux
- 풀이
- AWS Cloud
- ios frida
- error
- dreamhack
- Dreamhack.io
- 빅데이터분석기사
- wireshark
- 빅분기 실기
- 빅데이터 분석기사 실기
- 클라우드
- FSB
- Today
- Total
0netw0m1ra
스택프레임(StackFrame) - BOF, RTL Attack 본문
#1. 스택프레임 프롤로그
스택이 생성되면서 수행되는 명령어 세트로 push를 통해 스택에 베이스포인터인 ebp를 쌓는다. 그럼 현재 ebp가 스택의 가장 위에 위치하기 때문에 스택의 가장 위를 알려주는 스택포인터 esp가 ebp를 가리킨다.
push ebp
mov ebp, esp
#2. 스택프레임 에필로그
스택이 정리되면서 스택에 쌓여있던 ebp와 eip를 정리한다.
leave
ret
- leave
mov esp, ebp
pop ebp
- ret
pop eip
jmp eip
#3. 스택프레임
#4. BufferOverflow
다음과 같은 코드가 있다.
위와 같은 함수의 경우 RTL 공격을 하기 위해서는 먼저 쉘코드를 작성한 후 주소를 알아낸다. 그 후, test()함수가 리턴되는 곳이나 main함수가 리턴되는 ret address에 쉘코드가 있는 주소를 overwrite하면 된다.
예를 들어, test()함수 ret address에 overwrite한다 가정하면, buf[32]+sfp[4]+쉘코드주소[4]를 적으면 된다.
#5. RTL
스택 오버 플로우가 가능한 경우에 nx bit가 설정된 경우, 쉘코드를 직접 스택에 저장하고 이를 실행하는 방법으로는 쉘을 획득할 수 없다. 이러한 nx bit 방식을 우회하기 위한 방법이 rtl 공격이다.
RTL은 프로그램에 의해 공유라이브러리가 메모리에 저장되기 때문에 공유 라이브러리를 통해 RET address를 조작하여 nx bit를 우회하는 것이다.
아래와 같은 코드가 있을 때, gets함수의 주소를 system()의 주소로 변경하고, "/bin/sh" 문자열을 인자로 사용하면 된다.
페이로드는 buf[16]+sfp[4]+system[4]+dummy[4]+binsh[4]가 되어야 한다.
이때, dummy가 적히는 이유는 코드 아래의 그림을 살펴본다.
<정상적인 스택 흐름>
<비정상적인 스택 흐름>
system()함수를 호출한 경우 스택프레임이 생성된다. 이때 system("/bin/sh")를 사용해야 한다.
따라서, 아래의 그림처럼
buf[16] + sfp[4] + ret[4]
system[4] + dummy[4] + "/bin/sh"[4] 로 페이로드를 작성해 gets()시에 입력하면 된다.
'나홀로 스터디' 카테고리의 다른 글
[앱분석] Android Frida 설치 및 사용법 (0) | 2021.11.03 |
---|---|
JEB2 오류 해결 (0) | 2021.09.26 |
빅엔디안 VS 리틀엔디안 (0) | 2021.07.12 |
checksec.sh 설치 및 사용법 (0) | 2021.06.12 |
SSL/TLS 통신과정 (0) | 2021.05.30 |