Background: SigReturn-Oriented Programming
λ€μ΄κ°λ©°..
λ°μ΄λ리 λ³΄νΈ κΈ°λ² κ°λ
μμ²΄κ° μμ λμλ μ
Έμ½λλ₯Ό ν΅ν΄ λ€μν μμ€ν
μ½μ νΈμΆν΄
μμ λͺ
λ Ήμ΄λ₯Ό μ€ννμμ΅λλ€. μ΄ κΈ°λ²μ μ΄μ©ν μνμ΄ κ³μλμ μ
Έμ½λμ μ€ν λ°©μ§λ₯Ό μν NX λ±μ₯
κ·Έλ¬λ μΌλ§κ°μ§ μμ μ
Έμ½λ€λ₯΄ μ€ννμ§ μκ³ lib ν¨μλ₯Ό νΈμΆν΄ 보νΈκΈ°λ²μ μ°ννλ RTL!
νλ‘κ·Έλ¨μ μ½λ₯Ό μ¬νμ©ν΄ μμ ν¨μλ₯Ό μ°μν΄ νΈμΆν μ μλ ROPλ λ±μ₯νμμ΅λλ€.
μλ‘ λ€λ₯Έ νλ‘κ·Έλ¨μμ κ°μ μ’
λ₯μ μ·¨μ½μ μ΄ μλ€ν΄λ 곡격 λμμ λ³΄νΈ κΈ°λ² λλ
μ€ν μ½λμ λ°λΌ 곡격νλ λ°©λ²μ΄ λ€λ₯΄κΈ°μ μ΄λ₯Ό κ³ λ €νμ¬ κ³μ 보νΈκΈ°λ²μ΄ μΆκ°λ©λλ€
μ΄λ²μ 2014λ
λ°νν SROPλ₯Ό μμ보기 μν΄ μκ·Έλ(Signal)μ μμλ΄
μλ€.
Signal
[리λ μ€ / μ λμ€ ] μκ·Έλμ΄λ? μκ·Έλ(SIGNAL) μ’ λ₯, μν©, μ μ¬ μκ·Έλ μ°¨μ΄μ
[리λ μ€ μ λμ€ μμ μ 볡 λͺ©μ°¨] μλ νμΈμ~ μ€λμ μκ·Έλ SIGNAL μ λν κ°λ΅ ν¬μ€ν μ μ§ννκ³ μ ν©λλ€! νΈμμ΄μ€μ 곑 μκ·Έλμ΄ μ ν(?)νλ©΄μ μκ·Έλμ΄ μ νΈλ₯Ό μλ―Ένλ€λ건 λ€λ€ μκ³ κ³
jhnyang.tistory.com
π©π» νλ‘μΈμ€ vs μ°λ λ μ°¨μ΄ μ 리
νλ‘μΈμ€(Process) νλ‘μΈμ€λΌλ λͺ μΉμ λ―μ€μ μλλ°, νλ‘κ·Έλ¨μ μΉμνλ¦¬λΌ μκ°λλ€. μ°λ¦¬κ° νν λ§νλ νλ‘κ·Έλ¨μ΄ μ€νλλ©΄ νλ‘μΈμ€ μΈμ€ν΄μ€κ° μμ±λλ€. μΈμ€ν΄μ€κ° μμ±λλ€λ μλ―Έ
inpa.tistory.com
μμ μ λκ° λ³΄μλ©΄ λμμ΄ λ¬΄μ§ λ§μ΄ 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 κΈ°λ²
μ°Έκ³ μλ£
Sigreturn-oriented programming - Wikipedia
From Wikipedia, the free encyclopedia Jump to navigation Jump to search Arbitrary code execution exploit Sigreturn-oriented programming (SROP) is a computer security exploit technique that allows an attacker to execute code in presence of security measures
en.wikipedia.org
Playing with signals : An overview on Sigreturn Oriented Programming - Stormshield
Back to last GreHack edition, Herbert Bos has presented a novel technique to exploit stack-based overflows more reliably on Linux. We review hereafter this new exploitation technique and provide an exploit along with the vulnerable server. Even if this tec
www.stormshield.com
μ°Έκ³ μ΄λ―Έμ§