SlideShare a Scribd company logo
March 12, 2017
시스템 해킹 기법 정리
이지혜 박현준 공승현
2
소개
2017-03-12
시스템 해킹 기법 정리
Buffer Overflow에
입문하는 분들을 위해
만들어짐
입문
실력 향상
개념 정리
문서를 작성하면서
확실히 배운다
몰랐던 기법도 정리하면서
실력 향상
3
목차
▪ 버퍼 안 쉘코드
▪ 버퍼 밖 쉘코드
▪ FPO (Frame Pointer Overwrite)
▪ FSB (Format String Bug)
▪ RTL (Return to libc)
▪ ROP (Return-Oriented Programming)
2017-03-12
시스템 해킹 기법 정리
4
버퍼 안의 쉘코드 [LOB gate → gremlin]
2017-03-12
시스템 해킹 기법 정리
쉘코드의 시작 주소 삽입
실제 쉘코드가 있는 자리
(버퍼 안)
5
버퍼 밖의 쉘코드 [LOB gremlin → cobolt]
2017-03-12
시스템 해킹 기법 정리
실제 쉘코드가 있는 자리
(버퍼 밖)
쉘코드의 시작 주소 삽입
March 12, 2017
FPO(Frame Pointer Overwrite)
7
FPO (Frame Pointer Overwrite) [LOB golem → darkknight]
2017-03-12
시스템 해킹 기법 정리
int main(){
int main = 1;
…..
A();
…..
…..
}
void A(){
int a = 2;
…..
B();
…..
…..
}
void B(){
int b = 3;
…..
}
main
A
B
A
main
8
FPO (Frame Pointer Overwrite) [LOB golem → darkknight]
2017-03-12
시스템 해킹 기법 정리
RET
SFP
1
RET
SFP
2
RET
SFP
3
RET
SFP
1
RET
SFP
2
RET
SFP
3
H
L
9
FPO (Frame Pointer Overwrite) [LOB golem → darkknight]
2017-03-12
시스템 해킹 기법 정리
void problem_child(char *src)
{
char buffer[40];
strncpy(buffer, src, 41);
printf("%sn", buffer);
}
main(int argc, char *argv[])
{
if(argc<2){
printf("argv errorn");
exit(0);
}
problem_child(argv[1]);
}
10
FPO (Frame Pointer Overwrite) [LOB golem → darkknight]
2017-03-12
시스템 해킹 기법 정리
void problem_child(char *src)
{
char buffer[40];
strncpy(buffer, src, 41);
printf("%sn", buffer);
}
main(int argc, char *argv[])
{
if(argc<2){
printf("argv errorn");
exit(0);
}
problem_child(argv[1]);
}
11
FPO (Frame Pointer Overwrite) [LOB golem → darkknight]
2017-03-12
시스템 해킹 기법 정리
problem_child_leave
→ mov esp,ebp
→ pop ebp
12
FPO (Frame Pointer Overwrite) [LOB golem → darkknight]
2017-03-12
시스템 해킹 기법 정리
problem_child_ret
→ pop eip와 같은 의미
다음 명령어 실행
→ ebp + 4
13
FPO (Frame Pointer Overwrite) [LOB golem → darkknight]
2017-03-12
시스템 해킹 기법 정리
Main_leave
→ mov esp,ebp
→ pop ebp
14
FPO (Frame Pointer Overwrite) [LOB golem → darkknight]
2017-03-12
시스템 해킹 기법 정리
Main_ret
→ pop eip와 같은 의미
다음 명령어 실행
→ ebp + 4
March 12, 2017
FSB(Format String Bug)
16
FSB (Format String Bug) [pwnable.kr fsb]
Format String Bug의 약자로 C언어 printf() 함수 취약점
printf() 함수에 서식 문자(%~)를 지정하지 않고 배열을 그대로 넘겨줬을 때의 결과
하지만 이 때 buf 배열에 서식 문자가 들어있다면?
17
FSB (Format String Bug) [pwnable.kr fsb]
하지만 이 때 buf 배열에 서식 문자가 들어있다면?
배열 안에 서식문자가 들어가니 서식 문자에 맞는 16진수(%x) 10진수(%d)가 찍혀 나온다
18
FSB (Format String Bug) [pwnable.kr fsb]
서식 문자를 많이 넣어보자
A를 의미하는 41이 출력된다
19
FSB (Format String Bug) [pwnable.kr fsb]
정상적으로 printf() 함수를 사용했을 때의 결과
컴파일러의 경고도 없고 buf 배열 안에 서식 문자가 있음에도 문자열로 취급한다.
20
FSB (Format String Bug) [pwnable.kr fsb]
기본적인 포맷 스트링 버그 공격은 %n을 이용
%n은 이 서식 문자를 만날 때 까지 총 출력된 값(바이트 수,글자 수,공백 포함)를
계산한 값을 그 다음 메모리 값의 위치(포인터로 값을 한 번 참조)에 넣는 기능을
한다
예)
printf(“%3735928559d%n”, &ptr) 의 의미:
0xdeadbeef의 10진수 값 >> ptr에 저장
21
FSB (Format String Bug) [pwnable.kr fsb]
2017-03-12
시스템 해킹 기법 정리
22
FSB (Format String Bug) [pwnable.kr fsb]
23
0x08048534 <+0>: push ebp
0x08048535 <+1>: mov ebp,esp
0x08048537 <+3>: sub esp,0x48
0x0804853a <+6>: mov DWORD PTR [ebp-0x24],0x8048870
0x08048541 <+13>: mov DWORD PTR [ebp-0x20],0x0
0x08048548 <+20>: lea eax,[ebp+0x8]
0x0804854b <+23>: mov DWORD PTR [ebp-0x10],eax
FSB (Format String Bug) [pwnable.kr fsb]
24
argv = ebp + 0x8
(72+8)/4 bytes = 20th offset
pargv = ebp-0x10
(72-16)/4 bytes = 14th offset
FSB (Format String Bug) [pwnable.kr fsb]
25
FSB (Format String Bug) [pwnable.kr fsb]
키의 주소 0x804a060의 10진수 값
%134520928d%14$n
// 키의 주소값을 14번째 자리(pargv)가 갖는
값을 참조해서 그 자리에(argv) 넣는다.
%20$n
//아무것도 출력을 안하고 20번째 자리(argv)가
갖는 값을 참조해 출력한 개수 값인 (0)으로
덮는다.
26
FSB (Format String Bug) [pwnable.kr fsb]
%134520932d%14$n
//키의 나머지 4바이트 주소로 한 번 더 덮는다
%20$n
27
FSB (Format String Bug) [pwnable.kr fsb]
key
March 12, 2017
RTL(Return to libc)
29
RTL (Return to libc) [LOB darkknight → bugbear]
2017-03-12
시스템 해킹 기법 정리
동적 컴파일시 갖는 공유 라이브러리로 리턴
NX bit(Never Executable bit)
기법 우회
→ 윈도우 DEP(Data Execution
Prevention)
→ 쉘코드를 실행하지 못하게 함
RTL
30
RTL (Return to libc) [LOB darkknight → bugbear]
2017-03-12
시스템 해킹 기법 정리
PLT
GOT
Procedure Linkage Table
→ 함수(프로시저)를 나열한 테이블
→ 외부 라이브러리 함수 사용 시 PLT를 참조
Global Offset Table
→ 실제 함수(프로시저)의 주소를 갖는 테이블
→ GOT 참조로 함수의 실제 주소로 접근해 실행
@got.plt
PLT
0x80483e0
libc의 함수 주소
GOT
0x804a018
함수 실행
libc
libc의 함수 주소
31
RTL (Return to libc) [LOB darkknight → bugbear]
2017-03-12
시스템 해킹 기법 정리
main(int argc, char *argv[])
{
char buffer[40];
int i;
if(argc < 2){
printf("argv errorn");
exit(0);
}
if(argv[1][47] == 'xbf')
{
printf("stack betrayed you!!n”);
exit(0);
}
strcpy(buffer, argv[1]);
printf("%sn", buffer);
}
param
dummy
RET
SFP
buffer[40]
32
RTL (Return to libc) [LOB darkknight → bugbear]
2017-03-12
시스템 해킹 기법 정리
param
dummy
RET
SFP
buffer[40]
A*44
x90*44
system()의 주소
문자열 “/bin/sh”의 주소
AAAA
33
RTL (Return to libc) [LOB darkknight → bugbear]
2017-03-12
시스템 해킹 기법 정리
1. 정적인 환경에서 주소 구하기
2. 동적인 환경에서 주소 구하기
34
RTL (Return to libc) [LOB darkknight → bugbear]
2017-03-12
시스템 해킹 기법 정리
a
dummy
RET
SFP
buffer[40]
%d
calling convention(호출 규약)
매개변수 전달, 값 반환, 스택 정리
→_stdcall
→_cdecl
→ _fastcall
→ _thiscall
매개변수를 오른쪽부터 전달함
printf(“%d”,a);
March 12, 2017
ROP(Return-Oriented
Programming)
36
ROP (Return-Oriented Programming)
2017-03-12
시스템 해킹 기법 정리
ASLR
→ 주소 공간 랜덤화
→ 스택, 힙 주소를
랜덤화해서 주소를 예측할
수 없음
NX bit (DEP)
→ 데이터 실행 방지
→ 설정되어 있는 메모리
공간에서는 명령어
실행되지 않음
ASCII-armor
→ 공유 라이브러리 영역
상위 주소에 0x00(NULL)
을 넣어 공격자의 접근을
막음
37
ROP (Return-Oriented Programming)
2017-03-12
시스템 해킹 기법 정리
Gadget, 가젯 원래 프로그램 안에 있는 (기계) 명령어 조각
38
ROP (Return-Oriented Programming)
2017-03-12
시스템 해킹 기법 정리
GOT Overwrite
libc의 함수 주소0x804a018
함수 실행
libc
임의의 함수 주소
임의의 함수 주소
변조
39
ROP (Return-Oriented Programming)
2017-03-12
시스템 해킹 기법 정리
GOT Overwrite
offset = strcpy - printf
strcpy = 0x8048350
printf = 0x8048370
offset = 0x0000020
printf() → strcpy()?
strcpy = printf + offset
printf@plt
add 연산 가젯
printf@got → strcpy()
40
ROP (Return-Oriented Programming)
2017-03-12
시스템 해킹 기법 정리
RTL chain
RET2
parameter
pop ;ret
RET
SFP
RET2
parameter2
pop pop ;ret
RET
SFP
parameter1
parameter
41
ROP (Return-Oriented Programming)
2017-03-12
시스템 해킹 기법 정리
ropasaurusrex
main()
{
input();
return write(1, “WINn”, 4u);
}
input()
{
char buf[136];
return read(0, &buf, 0x100u);
}
RET
SFP
BUF[136]
42
ROP (Return-Oriented Programming)
2017-03-12시스템 해킹 기법 정리
ropasaurusrex-
시나리오1
RET
SFP
BUF[136]A*136
write()의 주소
AAAA
POP3RETPOP*3 + RET의 주소
1
4
write_got
input()_addr
write()의 인자들
취약한 함수 다시
호출
43
ROP (Return-Oriented Programming)
2017-03-12시스템 해킹 기법 정리
ropasaurusrex-
시나리오2
RET
SFP
BUF[136]A*136
read()의 주소
AAAA
POP3RETPOP*3 + RET의 주소
0
10
bss
input()_addr
read()의 인자들
취약한 함수 다시
호출
44
ROP (Return-Oriented Programming)
2017-03-12시스템 해킹 기법 정리
ropasaurusrex-
시나리오3
RET
SFP
BUF[136]A*136
system()의 주소
AAAA
Dummy
&“/bin/sh”
2017-03-12 동아리이름

More Related Content

What's hot

덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
Esun Kim
 
사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401
guest91f89d83
 
11장 윈도우 스레드 풀
11장 윈도우 스레드 풀11장 윈도우 스레드 풀
11장 윈도우 스레드 풀
홍준 김
 
7. variable scope rule,-storage_class
7. variable scope rule,-storage_class7. variable scope rule,-storage_class
7. variable scope rule,-storage_class
웅식 전
 

What's hot (20)

Python 생태계의 이해
Python 생태계의 이해Python 생태계의 이해
Python 생태계의 이해
 
Buffer Overflow PPT (OneTwo)
Buffer Overflow PPT (OneTwo)Buffer Overflow PPT (OneTwo)
Buffer Overflow PPT (OneTwo)
 
파이선 실전공략-1
파이선 실전공략-1파이선 실전공략-1
파이선 실전공략-1
 
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
 
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
 
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
파이썬 데이터과학 레벨2 - 데이터 시각화와 실전 데이터분석, 그리고 머신러닝 입문 (2020년 이태영)
 
Writing Fast Code (KR)
Writing Fast Code (KR)Writing Fast Code (KR)
Writing Fast Code (KR)
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
 
Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706
 
Linux programming study
Linux programming studyLinux programming study
Linux programming study
 
[강릉원주대 대기환경과학과] 대기과학전산입문 설명서
[강릉원주대 대기환경과학과] 대기과학전산입문 설명서[강릉원주대 대기환경과학과] 대기과학전산입문 설명서
[강릉원주대 대기환경과학과] 대기과학전산입문 설명서
 
Taocp 1.4.1 subroutine
Taocp 1.4.1 subroutineTaocp 1.4.1 subroutine
Taocp 1.4.1 subroutine
 
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
 
도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편
 
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
[2009 CodeEngn Conference 03] hkpco - DEFCON CTF 2009 Binary Leetness 100-500...
 
사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401
 
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
 
11장 윈도우 스레드 풀
11장 윈도우 스레드 풀11장 윈도우 스레드 풀
11장 윈도우 스레드 풀
 
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
 
7. variable scope rule,-storage_class
7. variable scope rule,-storage_class7. variable scope rule,-storage_class
7. variable scope rule,-storage_class
 

Similar to [2017 Incognito] 시스템 해킹 기법 정리

사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
Esun Kim
 
[2012 02 03]clean_code 5장
[2012 02 03]clean_code 5장[2012 02 03]clean_code 5장
[2012 02 03]clean_code 5장
Jong Pil Won
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)
SeongHyun Ahn
 

Similar to [2017 Incognito] 시스템 해킹 기법 정리 (20)

사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
 
Macro & compilation
Macro & compilationMacro & compilation
Macro & compilation
 
Introduce php7
Introduce php7Introduce php7
Introduce php7
 
[2020 컨트리뷰톤] 리브레오피스의 버그질라 소개 및 사용법, 버그 헌팅 세션
[2020 컨트리뷰톤] 리브레오피스의 버그질라 소개 및 사용법, 버그 헌팅 세션 [2020 컨트리뷰톤] 리브레오피스의 버그질라 소개 및 사용법, 버그 헌팅 세션
[2020 컨트리뷰톤] 리브레오피스의 버그질라 소개 및 사용법, 버그 헌팅 세션
 
2016 hack festival igrus
2016 hack festival igrus2016 hack festival igrus
2016 hack festival igrus
 
Assembly 스터디 2
Assembly 스터디 2Assembly 스터디 2
Assembly 스터디 2
 
DEVIEW-FULL-감독판.pptx
DEVIEW-FULL-감독판.pptxDEVIEW-FULL-감독판.pptx
DEVIEW-FULL-감독판.pptx
 
정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)정규표현식 Regular expression (regex)
정규표현식 Regular expression (regex)
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 
[2012 02 03]clean_code 5장
[2012 02 03]clean_code 5장[2012 02 03]clean_code 5장
[2012 02 03]clean_code 5장
 
[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California
 
해커가 되고 싶은 자는 나에게... 정보보안 입문과 길 찾기
해커가 되고 싶은 자는 나에게... 정보보안 입문과 길 찾기해커가 되고 싶은 자는 나에게... 정보보안 입문과 길 찾기
해커가 되고 싶은 자는 나에게... 정보보안 입문과 길 찾기
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)
 
C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발
 
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) 파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
 
[2021 오픈소스 컨트리뷰션 아카데미] #5 컨트리뷰션 정리 및 gerrit리뷰시스템 소개 등
[2021 오픈소스 컨트리뷰션 아카데미] #5 컨트리뷰션 정리 및 gerrit리뷰시스템 소개 등[2021 오픈소스 컨트리뷰션 아카데미] #5 컨트리뷰션 정리 및 gerrit리뷰시스템 소개 등
[2021 오픈소스 컨트리뷰션 아카데미] #5 컨트리뷰션 정리 및 gerrit리뷰시스템 소개 등
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
liftIO 2022 quasiquote
liftIO 2022 quasiquoteliftIO 2022 quasiquote
liftIO 2022 quasiquote
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 
[2021 오픈소스 컨트리뷰션 아카데미] #9 리브레오피스(LibreOffice) 컨트리뷰션 정리
[2021 오픈소스 컨트리뷰션 아카데미] #9 리브레오피스(LibreOffice) 컨트리뷰션 정리[2021 오픈소스 컨트리뷰션 아카데미] #9 리브레오피스(LibreOffice) 컨트리뷰션 정리
[2021 오픈소스 컨트리뷰션 아카데미] #9 리브레오피스(LibreOffice) 컨트리뷰션 정리
 

More from NAVER D2

More from NAVER D2 (20)

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual Search
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
 

[2017 Incognito] 시스템 해킹 기법 정리

  • 1. March 12, 2017 시스템 해킹 기법 정리 이지혜 박현준 공승현
  • 2. 2 소개 2017-03-12 시스템 해킹 기법 정리 Buffer Overflow에 입문하는 분들을 위해 만들어짐 입문 실력 향상 개념 정리 문서를 작성하면서 확실히 배운다 몰랐던 기법도 정리하면서 실력 향상
  • 3. 3 목차 ▪ 버퍼 안 쉘코드 ▪ 버퍼 밖 쉘코드 ▪ FPO (Frame Pointer Overwrite) ▪ FSB (Format String Bug) ▪ RTL (Return to libc) ▪ ROP (Return-Oriented Programming) 2017-03-12 시스템 해킹 기법 정리
  • 4. 4 버퍼 안의 쉘코드 [LOB gate → gremlin] 2017-03-12 시스템 해킹 기법 정리 쉘코드의 시작 주소 삽입 실제 쉘코드가 있는 자리 (버퍼 안)
  • 5. 5 버퍼 밖의 쉘코드 [LOB gremlin → cobolt] 2017-03-12 시스템 해킹 기법 정리 실제 쉘코드가 있는 자리 (버퍼 밖) 쉘코드의 시작 주소 삽입
  • 6. March 12, 2017 FPO(Frame Pointer Overwrite)
  • 7. 7 FPO (Frame Pointer Overwrite) [LOB golem → darkknight] 2017-03-12 시스템 해킹 기법 정리 int main(){ int main = 1; ….. A(); ….. ….. } void A(){ int a = 2; ….. B(); ….. ….. } void B(){ int b = 3; ….. } main A B A main
  • 8. 8 FPO (Frame Pointer Overwrite) [LOB golem → darkknight] 2017-03-12 시스템 해킹 기법 정리 RET SFP 1 RET SFP 2 RET SFP 3 RET SFP 1 RET SFP 2 RET SFP 3 H L
  • 9. 9 FPO (Frame Pointer Overwrite) [LOB golem → darkknight] 2017-03-12 시스템 해킹 기법 정리 void problem_child(char *src) { char buffer[40]; strncpy(buffer, src, 41); printf("%sn", buffer); } main(int argc, char *argv[]) { if(argc<2){ printf("argv errorn"); exit(0); } problem_child(argv[1]); }
  • 10. 10 FPO (Frame Pointer Overwrite) [LOB golem → darkknight] 2017-03-12 시스템 해킹 기법 정리 void problem_child(char *src) { char buffer[40]; strncpy(buffer, src, 41); printf("%sn", buffer); } main(int argc, char *argv[]) { if(argc<2){ printf("argv errorn"); exit(0); } problem_child(argv[1]); }
  • 11. 11 FPO (Frame Pointer Overwrite) [LOB golem → darkknight] 2017-03-12 시스템 해킹 기법 정리 problem_child_leave → mov esp,ebp → pop ebp
  • 12. 12 FPO (Frame Pointer Overwrite) [LOB golem → darkknight] 2017-03-12 시스템 해킹 기법 정리 problem_child_ret → pop eip와 같은 의미 다음 명령어 실행 → ebp + 4
  • 13. 13 FPO (Frame Pointer Overwrite) [LOB golem → darkknight] 2017-03-12 시스템 해킹 기법 정리 Main_leave → mov esp,ebp → pop ebp
  • 14. 14 FPO (Frame Pointer Overwrite) [LOB golem → darkknight] 2017-03-12 시스템 해킹 기법 정리 Main_ret → pop eip와 같은 의미 다음 명령어 실행 → ebp + 4
  • 16. 16 FSB (Format String Bug) [pwnable.kr fsb] Format String Bug의 약자로 C언어 printf() 함수 취약점 printf() 함수에 서식 문자(%~)를 지정하지 않고 배열을 그대로 넘겨줬을 때의 결과 하지만 이 때 buf 배열에 서식 문자가 들어있다면?
  • 17. 17 FSB (Format String Bug) [pwnable.kr fsb] 하지만 이 때 buf 배열에 서식 문자가 들어있다면? 배열 안에 서식문자가 들어가니 서식 문자에 맞는 16진수(%x) 10진수(%d)가 찍혀 나온다
  • 18. 18 FSB (Format String Bug) [pwnable.kr fsb] 서식 문자를 많이 넣어보자 A를 의미하는 41이 출력된다
  • 19. 19 FSB (Format String Bug) [pwnable.kr fsb] 정상적으로 printf() 함수를 사용했을 때의 결과 컴파일러의 경고도 없고 buf 배열 안에 서식 문자가 있음에도 문자열로 취급한다.
  • 20. 20 FSB (Format String Bug) [pwnable.kr fsb] 기본적인 포맷 스트링 버그 공격은 %n을 이용 %n은 이 서식 문자를 만날 때 까지 총 출력된 값(바이트 수,글자 수,공백 포함)를 계산한 값을 그 다음 메모리 값의 위치(포인터로 값을 한 번 참조)에 넣는 기능을 한다 예) printf(“%3735928559d%n”, &ptr) 의 의미: 0xdeadbeef의 10진수 값 >> ptr에 저장
  • 21. 21 FSB (Format String Bug) [pwnable.kr fsb] 2017-03-12 시스템 해킹 기법 정리
  • 22. 22 FSB (Format String Bug) [pwnable.kr fsb]
  • 23. 23 0x08048534 <+0>: push ebp 0x08048535 <+1>: mov ebp,esp 0x08048537 <+3>: sub esp,0x48 0x0804853a <+6>: mov DWORD PTR [ebp-0x24],0x8048870 0x08048541 <+13>: mov DWORD PTR [ebp-0x20],0x0 0x08048548 <+20>: lea eax,[ebp+0x8] 0x0804854b <+23>: mov DWORD PTR [ebp-0x10],eax FSB (Format String Bug) [pwnable.kr fsb]
  • 24. 24 argv = ebp + 0x8 (72+8)/4 bytes = 20th offset pargv = ebp-0x10 (72-16)/4 bytes = 14th offset FSB (Format String Bug) [pwnable.kr fsb]
  • 25. 25 FSB (Format String Bug) [pwnable.kr fsb] 키의 주소 0x804a060의 10진수 값 %134520928d%14$n // 키의 주소값을 14번째 자리(pargv)가 갖는 값을 참조해서 그 자리에(argv) 넣는다. %20$n //아무것도 출력을 안하고 20번째 자리(argv)가 갖는 값을 참조해 출력한 개수 값인 (0)으로 덮는다.
  • 26. 26 FSB (Format String Bug) [pwnable.kr fsb] %134520932d%14$n //키의 나머지 4바이트 주소로 한 번 더 덮는다 %20$n
  • 27. 27 FSB (Format String Bug) [pwnable.kr fsb] key
  • 29. 29 RTL (Return to libc) [LOB darkknight → bugbear] 2017-03-12 시스템 해킹 기법 정리 동적 컴파일시 갖는 공유 라이브러리로 리턴 NX bit(Never Executable bit) 기법 우회 → 윈도우 DEP(Data Execution Prevention) → 쉘코드를 실행하지 못하게 함 RTL
  • 30. 30 RTL (Return to libc) [LOB darkknight → bugbear] 2017-03-12 시스템 해킹 기법 정리 PLT GOT Procedure Linkage Table → 함수(프로시저)를 나열한 테이블 → 외부 라이브러리 함수 사용 시 PLT를 참조 Global Offset Table → 실제 함수(프로시저)의 주소를 갖는 테이블 → GOT 참조로 함수의 실제 주소로 접근해 실행 @got.plt PLT 0x80483e0 libc의 함수 주소 GOT 0x804a018 함수 실행 libc libc의 함수 주소
  • 31. 31 RTL (Return to libc) [LOB darkknight → bugbear] 2017-03-12 시스템 해킹 기법 정리 main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv errorn"); exit(0); } if(argv[1][47] == 'xbf') { printf("stack betrayed you!!n”); exit(0); } strcpy(buffer, argv[1]); printf("%sn", buffer); } param dummy RET SFP buffer[40]
  • 32. 32 RTL (Return to libc) [LOB darkknight → bugbear] 2017-03-12 시스템 해킹 기법 정리 param dummy RET SFP buffer[40] A*44 x90*44 system()의 주소 문자열 “/bin/sh”의 주소 AAAA
  • 33. 33 RTL (Return to libc) [LOB darkknight → bugbear] 2017-03-12 시스템 해킹 기법 정리 1. 정적인 환경에서 주소 구하기 2. 동적인 환경에서 주소 구하기
  • 34. 34 RTL (Return to libc) [LOB darkknight → bugbear] 2017-03-12 시스템 해킹 기법 정리 a dummy RET SFP buffer[40] %d calling convention(호출 규약) 매개변수 전달, 값 반환, 스택 정리 →_stdcall →_cdecl → _fastcall → _thiscall 매개변수를 오른쪽부터 전달함 printf(“%d”,a);
  • 36. 36 ROP (Return-Oriented Programming) 2017-03-12 시스템 해킹 기법 정리 ASLR → 주소 공간 랜덤화 → 스택, 힙 주소를 랜덤화해서 주소를 예측할 수 없음 NX bit (DEP) → 데이터 실행 방지 → 설정되어 있는 메모리 공간에서는 명령어 실행되지 않음 ASCII-armor → 공유 라이브러리 영역 상위 주소에 0x00(NULL) 을 넣어 공격자의 접근을 막음
  • 37. 37 ROP (Return-Oriented Programming) 2017-03-12 시스템 해킹 기법 정리 Gadget, 가젯 원래 프로그램 안에 있는 (기계) 명령어 조각
  • 38. 38 ROP (Return-Oriented Programming) 2017-03-12 시스템 해킹 기법 정리 GOT Overwrite libc의 함수 주소0x804a018 함수 실행 libc 임의의 함수 주소 임의의 함수 주소 변조
  • 39. 39 ROP (Return-Oriented Programming) 2017-03-12 시스템 해킹 기법 정리 GOT Overwrite offset = strcpy - printf strcpy = 0x8048350 printf = 0x8048370 offset = 0x0000020 printf() → strcpy()? strcpy = printf + offset printf@plt add 연산 가젯 printf@got → strcpy()
  • 40. 40 ROP (Return-Oriented Programming) 2017-03-12 시스템 해킹 기법 정리 RTL chain RET2 parameter pop ;ret RET SFP RET2 parameter2 pop pop ;ret RET SFP parameter1 parameter
  • 41. 41 ROP (Return-Oriented Programming) 2017-03-12 시스템 해킹 기법 정리 ropasaurusrex main() { input(); return write(1, “WINn”, 4u); } input() { char buf[136]; return read(0, &buf, 0x100u); } RET SFP BUF[136]
  • 42. 42 ROP (Return-Oriented Programming) 2017-03-12시스템 해킹 기법 정리 ropasaurusrex- 시나리오1 RET SFP BUF[136]A*136 write()의 주소 AAAA POP3RETPOP*3 + RET의 주소 1 4 write_got input()_addr write()의 인자들 취약한 함수 다시 호출
  • 43. 43 ROP (Return-Oriented Programming) 2017-03-12시스템 해킹 기법 정리 ropasaurusrex- 시나리오2 RET SFP BUF[136]A*136 read()의 주소 AAAA POP3RETPOP*3 + RET의 주소 0 10 bss input()_addr read()의 인자들 취약한 함수 다시 호출
  • 44. 44 ROP (Return-Oriented Programming) 2017-03-12시스템 해킹 기법 정리 ropasaurusrex- 시나리오3 RET SFP BUF[136]A*136 system()의 주소 AAAA Dummy &“/bin/sh”