๋ค์ด๊ฐ๋ฉฐ..
๋ฐ์ด๋๋ฆฌ ๋ณดํธ ๊ธฐ๋ฒ ๊ฐ๋
์์ฒด๊ฐ ์์ ๋์๋ ์
ธ์ฝ๋๋ฅผ ํตํด ๋ค์ํ ์์คํ
์ฝ์ ํธ์ถํด
์์ ๋ช
๋ น์ด๋ฅผ ์คํํ์์ต๋๋ค. ์ด ๊ธฐ๋ฒ์ ์ด์ฉํ ์ํ์ด ๊ณ์๋์ ์
ธ์ฝ๋์ ์คํ ๋ฐฉ์ง๋ฅผ ์ํ NX ๋ฑ์ฅ
๊ทธ๋ฌ๋ ์ผ๋ง๊ฐ์ง ์์ ์
ธ์ฝ๋ค๋ฅด ์คํํ์ง ์๊ณ lib ํจ์๋ฅผ ํธ์ถํด ๋ณดํธ๊ธฐ๋ฒ์ ์ฐํํ๋ RTL!
ํ๋ก๊ทธ๋จ์ ์ฝ๋ฅผ ์ฌํ์ฉํด ์์ ํจ์๋ฅผ ์ฐ์ํด ํธ์ถํ ์ ์๋ ROP๋ ๋ฑ์ฅํ์์ต๋๋ค.
์๋ก ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์์ ๊ฐ์ ์ข
๋ฅ์ ์ทจ์ฝ์ ์ด ์๋คํด๋ ๊ณต๊ฒฉ ๋์์ ๋ณดํธ ๊ธฐ๋ฒ ๋๋
์คํ ์ฝ๋์ ๋ฐ๋ผ ๊ณต๊ฒฉํ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๊ธฐ์ ์ด๋ฅผ ๊ณ ๋ คํ์ฌ ๊ณ์ ๋ณดํธ๊ธฐ๋ฒ์ด ์ถ๊ฐ๋ฉ๋๋ค
์ด๋ฒ์ 2014๋
๋ฐํํ SROP๋ฅผ ์์๋ณด๊ธฐ ์ํด ์๊ทธ๋(Signal)์ ์์๋ด
์๋ค.
Signal
์์ ์ ๋๊ฐ ๋ณด์๋ฉด ๋์์ด ๋ฌด์ง ๋ง์ด good!
์ ์ฌ์ดํธ๋ฅผ ๋ณด๊ณ ๊ณต๋ถํ์์ต๋๋ค(์ด์ ์ ๋ง์คํฐ ์นด๋๋ฆฌ์์ ์ค๋ช
ํ๋๋ฐ ํ ๋ฒ ๋ ์๊ฐ์ ..ํ)
OS๋ ํฌ๊ฒ ์ ์ ๋ชจ๋์ ์ปค๋ ๋ชจ๋๋ก ๋๋๋๋ฐ ์ค์ ๋ก ํ์ผ์ ์์ฑ, ์คํํ๋ ๊ฒ์
์ ์ ์์ ์ปค๋๋ก ๋์ด๊ฐ์ ์ปค๋์์ ๋์(rtld์ ์ ์ฌํฉ๋๋ค.) ๋ค์ ์ ์ ๋ก ์ํธ์์ฉํฉ๋๋ค.
์๊ทธ๋์ ํ๋ก์ธ์ค์์ ํน์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ๋งค๊ฐ์ฒด๋ก, SIGSEGV ๋ํ ์๊ทธ๋์
๋๋ค.(flag[๊ณต๊ฒฉ ๋ง๊ณ ]์ด์ง์)
๋ฆฌ๋
์ค์๋ ๋ค์ํ ์๊ทธ๋์ด ์ ๊ณต๋๋ฉฐ ์๋ ์ด๋ฏธ์ง๋ ๋ํ์ ์ธ ์์์
๋๋ค.
์๊ทธ๋ ๋์ ๋ฐฉ์
12345678910111213141516171819 // Name: sig_alarm.c// Compile: gcc -o sig_alarm sig_alarm.c#include<stdio.h>#include<unistd.h>#include<signal.h>#include<stdlib.h>void sig_handler(int signum){printf("sig_handler called.\n");exit(0);}int main(){signal(SIGALRM,sig_handler);alarm(5);getchar();return 0;}cs
์ ์ฝ๋๋ ํ๋ก๊ทธ๋จ์ ์ ์ ์ข
๋ฃ๋ฅผ ์ํด alerm(?) ํจ์๋ฅผ ํธ์ถ ์ง์ ์๊ฐ์ด ์ง๋๋ฉด ํ๋ก๊ทธ๋จ ์ข
๋ฃ
์๊ทธ๋ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ๋ ์ฝ๋๋ก ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. ์ 5์ด ํ sig_handler ํธ์ถ ์์ ์ง์
signal ํจ์๋ฅผ ์ฌ์ฉํด SIGALRM ์๊ทธ๋์ด ๋ฐ์ํ๋ฉด sig_handler ํจ์๊ฐ ์คํ๋ฉ๋๋ค.
ํ๋ก์ธ์ค์์ ์ด ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ๋ ๋ฏ ์ถ์ง๋ง, SIGALRM ์๊ทธ๋์ด ๋ฐ์ ์ ์ปค๋ ๋ชจ๋ ์ง์
์ฌ๊ธฐ์ ์๊ทธ๋์ ์ปค๋ ๋ชจ๋์์ ์ฒ๋ฆฌํ๊ณ ๋์ ๋ค์ ์ ์ ๋ชจ๋๋ก ๋์์ ํ๋ก์ธ์ค ์ฝ๋๋ฅผ ์คํํด์ผํฉ๋๋ค.
์ฆ, ์ ์ ๋ชจ๋์ ์ํ๋ฅผ ๋ชจ๋ ๊ธฐ์ตํ๊ณ ๋๋์์ฌ ์ ์๋ค๋ ๋ป์
๋๋ค.(ํ๋ก์ธ์ค(์๊ทธ๋)์ ํน์ง์
๋๋ค)
์ฌ๊ธฐ์ ์ํ๋, ์๊ทธ๋์ด ๋ฐ์ ์ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ, ๋ ์ง์คํฐ ๋ฑ์ด ํฌํจ๋ฉ๋๋ค.
์ปค๋์์๋ ์ ์ ๋ชจ๋๋ก ๋๋์๊ฐ ์ํฉ์ ๊ณ ๋ คํด ์ ์ ํ๋ก์ธ์ค์ ์ํ๋ฅผ ์ ์ฅํ๋ ์ฝ๋๊ฐ ๊ตฌํ๋์ด ์์ด์
do_signal
do_signal ํจ์๋ ์๊ทธ๋์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ ค ๋จผ์ ํธ์ถ๋๋ ํจ์์
๋๋ค.
๋ฆฌ๋
์ค ์ปค๋ ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฅธ๋ฐ ์ดํด๋ณด๋ฉด..
5.8 ๋ฒ์ ์ดํ : do_signal
5.10 ๋ฒ์ ์ดํ : arch_do_signal
์์ ๋ฒ์ : arch_do_signal_or_restart
๋ก ๋ช ๋ช ๋์์ต๋๋ค.
์๋ ์ด๋ฏธ์ง๋ ๊ทธ ํด๋น ํจ์์ด๋ฉฐ, ์๊ทธ๋์ด ๋ฐ์ํ๋ค๋ฉด ์ ๋ณด๋ฅผ ์ธ์๋ก get_signal ํจ์ ํธ์ถ
ํด๋น ํจ์๋ ์๊ทธ๋์ ํด๋นํ ํธ๋ค๋ฌ๊ฐ ๋ฑ๋ก๋ฌ๋์ง ํ์ธํฉ๋๋ค.
๋ง์ฝ ํธ๋ค๋ฌ๊ฐ ๋ฑ๋ก๋์ด ์๋ค๋ฉด ์๊ทธ๋์ ๋ํ ์ ๋ณด์ ๋ ์ง์คํฐ ์ ๋ณด๋ฅผ ์ธ์ handle_signal ํจ์ ํธ์ถ
handle_signal
handle_signal ํจ์์ ์ผ๋ถ๋ก, setup_rt_frame ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
ํด๋น ํจ์๋ ์๊ทธ๋์ ์ ์ฉ๋ ํธ๋ค๋ฌ ์กด์ฌ ์, ํธ๋ค๋ฌ์ ์ฃผ์๋ฅผ ๋ค์ ์คํ ์ฃผ์๋ก ์ฝ์
ํฉ๋๋ค.
์์ ์์ ์์๋ SIGALRM์ด ๋ฐ์ํ ๊ฒฝ์ฐ ํด๋น ์ฝ๋๋ฅผ ํตํด sig_handler ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
Sigreturn
ํ์ ํ๋ก์ธ์ค๊ฐ ๋ฐ๋๋ ๊ฒ์ ์ปจํ
์คํธ ์ค์์นญ(Context Switching)์ด๋ผ๊ณ ํฉ๋๋ค.
์์ ๋ณธ ๊ฒ์ฒ๋ผ ์ปค๋์ด ์ ์ ๊ฐ ์์ฑํ ํ๋ก์ธ์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ค์ํ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
์ปจํ
์คํธ ์ค์์นญ์ด ์ผ์ด๋๋ฉด ๋ค์ ์ ์ ํ๋ก์ธ์ค๋ก ๋ณต๊ทํ์ผํฉ๋๋ค. ๋ฐ๋ผ์ ์ค์์นญ์ด ๋ฐ์ ์
์ํฉ์ ์ปค๋์์ ๊ธฐ์ตํ๊ณ , ์ปค๋ ์ฝ๋์ ์คํ์ด ๋ง์น๋ฉด ๊ธฐ์ตํ ์ ๋ณด๋ฅผ ๋๋๋ ค ๋ณต๊ทํด์ผํฉ๋๋ค.
์ด๋ ์ฌ์ฉ๋๋ ์์คํ
์ฝ์ด sigreturn!
restore_sigcontext ํจ์์ ์ฝ๋๋ก sigreturn ์์คํ
์ฝ ํธ์ถ ์ ๋ด๋ถ์ ์ผ๋ก ํด๋น ํจ์๋ฅผ
ํธ์ถ ์คํ์ ์ ์ฅ๋ ๊ฐ์ ๊ฐ ๋ ์ง์คํฐ์ ๋ณต์ฌ ๊ธฐ์กด ์ํฉ๊ณผ ์คํ ์ฝ๋๋ฅผ ๊ธฐ์ต ๋ณต๊ทํฉ๋๋ค.
์ ์ฝ๋์์ sigcontext๋ผ๋ ๊ตฌ์กฐ์ฒด sc๊ฐ ์กด์ฌํ๋ ๊ฐ ๋ฉค๋ฒ ๋ณ์์ ๊ฐ์ ์ฝ์
ํ๋ ๊ฒ์ ํ์ธ๊ฐ๋ฅํจ
ํด๋น ๊ตฌ์กฐ์ฒด์ ๋ํ์ฌ ๋ ์์๋ณผ๊น์?
sigcontext
๊ตฌ์กฐ์ฒด๋ฅผ ์ดํด๋ณด๋ฉด.. ๋ ์ง์คํฐ์ ๋ช
์นญ์ ๊ฐ์ง ๊ฐ ๋ฉค๋ฒ ๋ณ์๊ฐ ์กด์ฌํ๋ ๊ฑธ ํ์ธ๊ฐ๋ฅํฉ๋๋ค.
๊ตฌ์กฐ์ฒด์ ๋งด๋ฒ ๋ณ์ ์์๋ ๊ฐ ๋ณต์ฌ ์์์๋ ์ ํ ๊ด๊ณ X(์์ ์ธ์ธ ํ์ ์๋น!!)
์ ํ๋ x86-64 arch์ ํด๋น๋๋ ๊ตฌ์กฐ์ฒด๋ก ์ด์ธ ์ํคํ
์ฒ ๊ณต๊ฒฉ ์
์ ๋ถ ํ์
(์ปค๋, ๊ตฌ์กฐ์ฒด) ๋ถ์ ๋ฐ ์งํํด์ผํฉ๋๋ค
SROP(SigReturn-Oriented Programming)
์ปจํ ์คํธ ์ค์์นญ์ ์ํด ์ฌ์ฉํ๋ sigreturn ์์ค์ฝ์ ์ด์ฉํ ROP ๊ธฐ๋ฒ
ROP์์๋ ์ฝ๋ ์กฐ๊ฐ ๋ชจ์ ์์ ์ฝ๋๋ฅผ ์คํํ๋ ๊ณต๊ฒฉ๊ธฐ๋ฒ์ ์๊ฐํ๋ฉด ์ด ์น๊ตฌ๋ sigreturn ์์ค์ฝ ํธ์ถ,
๋ ์ง์คํฐ์ ๋ณต์ฌํ ๊ฐ ๋ฏธ๋ฆฌ ์คํ์ ์ ์ฅ ์์ ์ฝ๋๋ฅผ ์คํํ๋ค๋ ์ ์ ์์์ ๋ฐฐ์ด ๋ด์ฉ์ ํตํด ์ ์ถ๋์ฃ
๋ชจ๋ ๋ ์ง์คํฐ๋ฅผ ์กฐ์ํ ์ ์๋ ๋งํผ ์ต์ค ํ์ฉ๋๋ ๋๊ณ ๋์ด๋๋ ์ด๋ฐ์ Ezํ๋ค๊ฐ ๊ฐ์๊ธฐ.. ใ
123456789101112 // Name: sigrt_call.c// Compile: gcc -o sigrt_call sigrt_call.c#include <string.h>int main(){char buf[1024];memset(buf, 0x41, sizeof(buf));asm("mov $15, %rax;""syscall");}cs
์ ์ฝ๋๋ sigreturn ์์ค์ฝ์ ํธ์ถ ๋ ์ง์คํฐ๋ฅผ ์คํ์ ๊ฐ์ผ๋ก ์กฐ์ํ๋ต๋๋ค.
์์ ๋ฅผ ์ปดํ์ผ ํ ๋๋ฒ๊ฑฐ๋ฅผ ํตํด ์งํํด๋ณด๋ฉด..
๋ง์น๋ฉฐ
๋งค์ฐ ํ์ฉ๋๊ฐ ๋์ SROP์ ๋ํ์ฌ ์๊ทธ๋์ด ๋ฐ์ ์ ์ปค๋์์ ์ด๋ค ์ฝ๋๋ฅผ ์คํ ๋ฐ
์ปจํ
์คํธ ์ค์์นญ์ ์ํด ์ฌ์ฉํ๋ sigreturn ์์ค์ฝ ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ด์ฉํ ๊ณต๊ฒฉ ๊ธฐ๋ฒ!
์คํ์ ๊ฐ์ ์ธ ์ ์๊ณ sigreturn ์์ค์ฝ์ ํธ์ถ ์ํฉ ์ ๋ชจ๋ ๋ ์ง์คํฐ๋ฅผ ์กฐ์ ๊ฐ๋ฅ!
(์ด ๋ถ๋ถ์.. ๋ค์ํ ์ ๊ทผ์ ํ๋ค๋ณด๋ฉด ์ฝ๊ฒ ์ํฉ ํ์
์ด ๋๊ฒ ์ฃ ?)
๊ทธ๋์ ์ต์ค ์ฑ๊ณต ๊ฐ๋ฅ์ฑ๋ ๋งค์ฐ ๋๊ณ ๊ณต๊ฒฉ์๋ ์ ์ฉํ ๊ธฐ์ ์ด์์ต๋๋ค.
KeyWord
- ์ปจํ
์คํธ ์ค์์นญ(Context Switching)
: ํ์ฌ ์คํ๋๋ ํ๋ก์ธ์ค๊ฐ ๋ฐ๋๋ ์์ - SigReturn-Oriented Programming(SROP)
: ์ปจํ ์คํธ ์ค์์นญ์ ์ํด ์ฌ์ฉํ๋ sigreturn ์์ค์ฝ์ ์ด์ฉํ ROP ๊ธฐ๋ฒ
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SigReturn-Oriented Programming (0) | 2022.11.13 |
---|---|
__environ (0) | 2022.11.13 |
Master Canary (0) | 2022.11.13 |
Exploit Tech: Master Canary (0) | 2022.11.13 |
Background: Master Canary (0) | 2022.11.10 |