본문 바로가기

IT/System Hacking

64bit 버퍼오버플로우(Buffer Overflow) /* written by kaspy (kaspyx@gmail.com)*/ 버퍼 오버플로우 공격기법이 등장한지도 꽤오래되었지만 64비트에서 공략하는 문서는 그리 많지않아서 정리하게되었다. 그냥... 64비트는 그환경특성상 exploit 하기 여러모로 굉장히 더어려워졌다. 1. 쉘코드 우선은 간단한거부터 말하자면 (당연한거지만) 64비트 리눅스 ELF 바이너리에서는 64비트 쉘코드를 써야한다는것이다. 32비트 같은 경우에는 eax 레지스터에 0xb를 넣고 ebx에 "/bin/sh"의 문자열의 주소, ecx,edx에는 0을 넣은뒤 int 0x80 어셈블리를 실행하면 쉘이 쉘이 떴다. 그러나 64비트에서는 syscall 이라는 어셈블리를 사용하고 rdi에 0x3b를 넣고, rsi와 rdx에 0을 넣은뒤 호출해야.. 더보기
Buffer Overflow - RTL(Return to library) 기법 /* written by kaspy (kaspyx@gmail.com)*/ 1. 서론 RTL(Return to library) 기법이란, 버퍼오버플로우(Buffer Overflow, 이하 BOF) 취약점이 존재하는 프로그램을 익스플로잇 할때 해당 프로그램의 스택(stack) 영역에 실행 권한이 존재하지 않을때 프로그램이 사용하는 glibc 내에 존재하는 함수를 호출하는 기법이다. 요즘 대부분의 리눅스 및 윈도우 시스템은 NX 또는 DEP등으로 스택(stack) 영역에 실행 권한을 주고있지않고, 특별한 컴파일 옵션을 주어서만 실행권한을 줄수있는만큼 간단하면서도 자주 사용되는 방법이다. 포너블문제(pwnable)에서는 기본중에 기본이니 잘알아두도록하자. * 테스트 환경은 우분투 리눅스 16.04 64bit 입.. 더보기
ROP(Return Oriented Programming) /* written by kaspy (kaspyx@gmail.com)*/ 1. 시작하며 ROP(Return Oriented Programming) 이란 버퍼 오버플로우 취약점이 발생하는 바이너리를 exploit 할때 가장 많이 사용되는 기법으로 바이너리 내부에 존재하는 gadget을 사용하여 호출 함수 및 인자를 조작하는 방법이다. 솔직히 관련 자료도 굉장히 많은데.. 나도 복습 할겸 정리해보았다. 일반적으로 ASLR이 걸려있는 바이너리는 Memory leak 또는 got, plt 등에 함수가 존재해야하는 특수한 전제가 붙어야 exploit 가능하지만, ROP 기법을 사용하면 (PIE가 걸려있지않아야함) 바이너리의 고정주소의 gadget을 활용하여 exploit 할수있다. 여기서 gadget이란 바이너리.. 더보기
리눅스 에그쉘(egg shell) 사용법 /* written by kaspy (kaspyx@gmail.com)*/ 에그쉘(eggshell)이란 취약한 바이너리를 exploit 할때 버퍼의 주소 계산이나 버퍼 사이즈등의 난관으로 공략하기 어려울때 이를 환경변수에 등록해두고 이주소를 사용한다. 로컬(local) 환경에서만 사용할수있는 단점이있다. 아래 두개 쉘코드는 25 바이트 및 22바이트로 나름 경량화하였다. 사용법은 export 명령어를 사용하여 에그쉘을 환경변수로 등록하고 getenv 함수를 통하여 에그쉘의 주소를 얻어온후, 프로그램의 ret 주소를 getenv 함수의 주소로 변경한다. 끗 shellcode 1 - 25 byte#include #include //export kaspyx=`python -c 'print "\x90"*10000.. 더보기
리눅스 쉘코드(shellcode) 크기 줄이기 /* written by kaspy (kaspyx@gmail.com)*/ 리눅스 쉘코드(shellcode) 사이즈 줄이기(경량화)는 해커들 사이에서도 많이 연구되는 문제로, 얼마나 작은 사이즈의 명령어를 사용하여 쉘코드를 띄우는가 하는 문제이다. 내가 알기로는 가장 작은 리눅스 쉘코드는 특수한 전제조건이 붙지 않았을때 21 바이트로 알고있는데 쉘코드 사이즈 줄이는 간략한 방법을 소개하도록 하겠다. 우선 내가 이전에 작성한 쉘코드의 사이즈는 25바이트로 아래와 같다. char buf[] ="\xeb\x0b\x31\xc0\x31\xd2\x31\xc9\x5b\xb0\x0b\xcd\x80\xe8\xf0\xff\xff\xff/bin/sh"; void main(){ int *ret; ret = (int*)&ret .. 더보기
libc-database 사용법 /* written by kaspy (kaspyx@gmail.com)*/ 1. libc-database 서론 libc-databse 라는게 무엇이냐하면, 주로 해킹대회에서 포너블(pwnable) 문제를 풀때 사용하는 유틸리티 프로그램인데, glibc 라이브러리버전별로 우리가 원하는 함수의 주소를 저장하고있는 데이터 베이스라고 보면될것이다. 다운로드는 아래 URL에서 다운받을수 있다. https://github.com/niklasb/libc-database 일반적으로 요즘 linux 시스템은 대부분 ASLR을 적용하여 사용되고있는데, 그래서 매번 실행될때마다 함수의 주소가 랜덤하게 바뀌며 그 오차도 꽤큰편이어서, 브루트포스 하기에도 매우 어렵다. NX 또한 기본적으로 사용하고있어서 쉘코드를 실행할때 스택이.. 더보기
포맷 스트링 버그(format string bug) 공격시에 플래그(flag)사용하기 /* written by kaspy (kaspyx@gmail.com)*/ 이전에 잠시 공부한적이 있지만, 까먹고있다가 이참에 공부해서 정리하게되었다. 포맷 스트링 버그 취약점을 가진 프로그램이 있을때, $-flag를 이용한 공격이 기존 기법에비해 꽤나 간단하고 유용해서 정리해봄 이방법은 특히 입력되는 버퍼의 크기가 작거나, printf 함수로부터 수정 주소까지 포맷스트링(%x..) 인자가 많이 필요할때 많은 포맷 스트링 문자열을 넣을 필요가 없어서 유용하다. 간단한 예제 소스코드를 들어 설명하겠다. * 테스트 환경 (ubuntu 64bit 12.04 LTS) // gcc -o flag_fsb flag_fsb.c -fno-stack-protector -mpreferred-stack-boundary=2 -m.. 더보기
포맷 스트링 버그(Format string bug) %hn 사용법 /* written by kaspy (kaspyx@gmail.com) */ 포맷 스트링 지정자중 %hn에 대한거 간단히 정리함, %hn 포맷 스트링(변환 지정자)는 2바이트 단위로 특정 메모리 주소에 현재까지 출력한 문자열의 개수를 저장해준다. 포맷 스트링 버그가 존재할때 %hn을 이용하면 프로그램의 ret 주소나 함수의 주소를 수정하여 공략이 가능하다. // gcc -o format_hn format_hn.c -m32 // sudo sysctl -w kernel.randomize_va_space=0 #include int main() { int p= 0xffffffff; char buf[256]; printf("before p = %08x, addr = %08x\n",p,&p); gets(buf); p.. 더보기
AFL fuzz(american fuzzy lop) Fuzzing Tool 사용하기 /* written by kaspy (kaspyx@gmail.com)*/ AFL(American fuzzy lop) Fuzz tool 이란 프로그램에 무작위의 데이터를 입력하게하여 버그 및 취약점을 찾아주는 자동화된 툴이라고 보면 된다. 일명 퍼징(fuzzing) 기법을 사용하며, 가장 큰 특징이라면 소스코드가 주어질시에, 컴파일시에 AFL 툴이 입력받는 소스코드 루틴을 찾아줘서 인풋값에 대한 무작위 데이터 생성의 효율성을 가지고 있다. 대신 단점이라면, 소스코드가 없는 black box 상태의 fuzzing은 어렵다는점이다. http://lcamtuf.coredump.cx/afl/ 사이트의 내용을 참고하여 정리한 내용이다. 1. AFL fuzzer 소스코드 다운로드 및 컴파일 사용환경 : linux 계.. 더보기
포맷 스트링 버그(Format string bug) 취약점이란? /* written by kaspy (kaspyx@gmail.com)*/ 포맷 스트링 버그(Format String bug,이하 FSB)란 버퍼 오버플로우 해킹 기법의 한종류로써, 사용자의 입력에 의해서 프로그램의 흐름을 변경시킬수있는 취약점이다. 아래와 같이 FSB 취약점이 있는 간단한 소스코드를 보도록 하겠다. 실습을 하기전에 Specifier Purpose %c Formats a single character %d Formats an integer in decimal notation (pre ANSI) %e , %E Formats a float or double in signed E notation %f Formats a float or double in decimal %I Formats an in.. 더보기