πŸŒ‡β”‚System_Study/πŸ“•β”‚Dreamhack_Hacking

Background: SigReturn-Oriented Programming

Jastes 2022. 11. 13. 23:00

λ“€μ–΄κ°€λ©°..

λ°”μ΄λ„ˆλ¦¬ 보호 기법 κ°œλ… μžμ²΄κ°€ 없을 λ•Œμ—λŠ” μ…Έμ½”λ“œλ₯Ό 톡해 λ‹€μ–‘ν•œ μ‹œμŠ€ν…œ μ½œμ„ ν˜ΈμΆœν•΄
μž„μ˜ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이 기법을 μ΄μš©ν•œ μœ„ν—™μ΄ κ³„μ†λ˜μž μ…Έμ½”λ“œμ˜ μ‹€ν–‰ 방지λ₯Ό μœ„ν•œ NX λ“±μž₯

κ·ΈλŸ¬λ‚˜ μ–Όλ§ˆκ°€μ§€ μ•Šμ•„ μ…Έμ½”λ“€λ₯΄ μ‹€ν–‰ν•˜μ§€ μ•Šκ³  lib ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄ λ³΄ν˜ΈκΈ°λ²•μ„ μš°νšŒν•˜λŠ” RTL!
ν”„λ‘œκ·Έλž¨μ˜ μ½›λ₯Ό μž¬ν™œμš©ν•΄ μž„μ˜ ν•¨μˆ˜λ₯Ό 연속해 ν˜ΈμΆœν•  수 μžˆλŠ” ROP도 λ“±μž₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μ„œλ‘œ λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—μ„œ 같은 μ’…λ₯˜μ˜ 취약점이 μžˆλ‹€ν•΄λ„ 곡격 λŒ€μƒμ˜ 보호 기법 λ˜λŠ”
μ‹€ν–‰ μ½”λ“œμ— 따라 κ³΅κ²©ν•˜λŠ” 방법이 λ‹€λ₯΄κΈ°μ— 이λ₯Ό κ³ λ €ν•˜μ—¬ 계속 λ³΄ν˜ΈκΈ°λ²•μ΄ μΆ”κ°€λ©λ‹ˆλ‹€
μ΄λ²ˆμ—” 2014λ…„ λ°œν‘œν•œ SROPλ₯Ό μ•Œμ•„λ³΄κΈ° μœ„ν•΄ μ‹œκ·Έλ„(Signal)을 μ•Œμ•„λ΄…μ‹œλ‹€.


Signal

 

[λ¦¬λˆ…μŠ€ / μœ λ‹‰μŠ€ ] μ‹œκ·Έλ„μ΄λž€? μ‹œκ·Έλ„(SIGNAL) μ’…λ₯˜, 상황, μœ μ‚¬ μ‹œκ·Έλ„ 차이점

[λ¦¬λˆ…μŠ€ μœ λ‹‰μŠ€ μ™„μ „ 정볡 λͺ©μ°¨] μ•ˆλ…•ν•˜μ„Έμš”~ μ˜€λŠ˜μ€ μ‹œκ·Έλ„ SIGNAL 에 λŒ€ν•œ κ°„λž΅ ν¬μŠ€νŒ…μ„ μ§„ν–‰ν•˜κ³ μž ν•©λ‹ˆλ‹€! νŠΈμ™€μ΄μŠ€μ˜ 곑 μ‹œκ·Έλ„μ΄ μœ ν–‰(?)ν•˜λ©΄μ„œ μ‹œκ·Έλ„μ΄ μ‹ ν˜Έλ₯Ό μ˜λ―Έν•œλ‹€λŠ”κ±΄ λ‹€λ“€ μ•Œκ³  계

jhnyang.tistory.com

 

 

πŸ‘©‍πŸ’» ν”„λ‘œμ„ΈμŠ€ vs μ“°λ ˆλ“œ 차이 정리

ν”„λ‘œμ„ΈμŠ€(Process) ν”„λ‘œμ„ΈμŠ€λΌλŠ” λͺ…칭은 λ‚―μ„€μˆ˜ μžˆλŠ”λ°, ν”„λ‘œκ·Έλž¨μ€ μΉœμˆ™ν•˜λ¦¬λΌ μƒκ°λœλ‹€. μš°λ¦¬κ°€ ν”νžˆ λ§ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λ©΄ ν”„λ‘œμ„ΈμŠ€ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœλ‹€. μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœλ‹€λŠ” 의미

inpa.tistory.com

μœ„μ— μ € λ‘κ°œ λ³΄μ‹œλ©΄ 도움이 무지 많이 good!

μœ„ μ‚¬μ΄νŠΈλ₯Ό 보고 κ³΅λΆ€ν•˜μ˜€μŠ΅λ‹ˆλ‹€(이전에 λ§ˆμŠ€ν„° μΉ΄λ‚˜λ¦¬μ—μ„œ μ„€λͺ…ν–ˆλŠ”λ° ν•œ 번 λ‚ μ•„κ°€μ„œ ..ν›„)
OSλŠ” 크게 μœ μ € λͺ¨λ“œμ™€ 컀널 λͺ¨λ“œλ‘œ λ‚˜λˆ„λŠ”λ° μ‹€μ œλ‘œ νŒŒμΌμ„ 생성, μ‹€ν–‰ν•˜λŠ” 것은
μœ μ €μ—μ„œ μ»€λ„λ‘œ λ„˜μ–΄κ°€μ„œ μ»€λ„μ—μ„œ λ™μž‘(rtld와 μœ μ‚¬ν•©λ‹ˆλ‹€.) λ‹€μ‹œ μœ μ €λ‘œ μƒν˜Έμž‘μš©ν•©λ‹ˆλ‹€.

μ‹œκ·Έλ„μ€ ν”„λ‘œμ„ΈμŠ€μ—μ„œ νŠΉμ • 정보λ₯Ό μ „λ‹¬ν•˜λŠ” 맀개체둜, SIGSEGV λ˜ν•œ μ‹œκ·Έλ„μž…λ‹ˆλ‹€.(flag[곡격 말고]μ΄μ§€μš”)
λ¦¬λˆ…μŠ€μ—λŠ” λ‹€μ–‘ν•œ μ‹œκ·Έλ„μ΄ 제곡되며 μ•„λž˜ μ΄λ―Έμ§€λŠ” λŒ€ν‘œμ μΈ μ˜ˆμ‹œμž…λ‹ˆλ‹€.


μ‹œκ·Έλ„ λ™μž‘ 방식

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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ν•˜λ‹€κ°€ κ°‘μžκΈ°.. γ… 

1
2
3
4
5
6
7
8
9
10
11
12
// Name: sigrt_call.c
// Compile: gcc -o sigrt_call sigrt_call.c 
 
#include <string.h>
int main()
{
        char buf[1024];
        memset(buf, 0x41sizeof(buf));
 
        asm("mov $15, %rax;"
            "syscall");
}
cs

μœ„ μ½”λ“œλŠ” sigreturn μ‹œμŠ€μ½œμ„ 호좜 λ ˆμ§€μŠ€ν„°λ₯Ό μŠ€νƒμ˜ κ°’μœΌλ‘œ μ‘°μž‘ν•œλ‹΅λ‹ˆλ‹€.
예제λ₯Ό 컴파일 ν›„ 디버거λ₯Ό 톡해 진행해보면..

μ™€μš°.. 배운 κ·ΈλŒ€λ‘œλ„€μš” γ…Ž


마치며

맀우 ν™œμš©λ„κ°€ 높은 SROP에 λŒ€ν•˜μ—¬ μ‹œκ·Έλ„μ΄ λ°œμƒ μ‹œ μ»€λ„μ—μ„œ μ–΄λ–€ μ½”λ“œλ₯Ό μ‹€ν–‰ 및
μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ„ μœ„ν•΄ μ‚¬μš©ν•˜λŠ” sigreturn μ‹œμŠ€μ½œ 그리고 이λ₯Ό μ΄μš©ν•œ 곡격 기법!

μŠ€νƒμ— 값을 μ“Έ 수 있고 sigreturn μ‹œμŠ€μ½œμ„ 호좜 상황 μ‹œ λͺ¨λ“  λ ˆμ§€μŠ€ν„°λ₯Ό μ‘°μž‘ κ°€λŠ₯!
(이 뢀뢄은.. λ‹€μ–‘ν•œ 접근을 ν•˜λ‹€λ³΄λ©΄ μ‰½κ²Œ 상황 νŒŒμ•…μ΄ 되겠죠?)
κ·Έλž˜μ„œ 읡슀 성곡 κ°€λŠ₯성도 맀우 λ†’κ³  곡격에도 μœ μš©ν•œ κΈ°μˆ μ΄μ˜€μŠ΅λ‹ˆλ‹€.

KeyWord

  • μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­(Context Switching)
    : ν˜„μž¬ μ‹€ν–‰λ˜λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ λ°”λ€ŒλŠ” μž‘μ—…
  • SigReturn-Oriented Programming(SROP)
    : μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ„ μœ„ν•΄ μ‚¬μš©ν•˜λŠ” sigreturn μ‹œμŠ€μ½œμ„ μ΄μš©ν•œ ROP 기법

참고 자료

μ°Έκ³  이미지