본문 바로가기
정보공유

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

by 날고싶은커피향 2017. 10. 30.

2017 Incognito에서 진행된 '시스템 해킹 기법 정리' (이지혜님, 박현준님, 공승현님) 발표자료 입니다.
많은 참고 하시기 바랍니다.

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

 

 

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
 15.  March 12, 2017 FSB(Format String Bug)
 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
 28.  March 12, 2017 RTL(Return to libc)
 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);
 35.  March 12, 2017 ROP(Return-Oriented Programming)
 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”
45.  2017-03-12 동아리이름

반응형