본문 바로가기

IT

리눅스 쉘코드(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 계.. 더보기
64bit 우분투(ubuntu) 리눅스에서 32bit 컴파일하기 gcc 컴파일 옵션에서 -m32 옵션을 주면 32비트 모드로 컴파일이 가능하다. 그러기위해선 아래와 같은 패키지를 설치해주면 된다. sudo apt-get install gcc-multilib 아래는 컴파일 결과 테스트용 소스코드 #include void main(){ unsigned long p; printf("%x\n",&p); printf("p's size is %d\n",sizeof(p));} - 32비트용 리눅스 실행파일로 컴파일하기 gcc -o bitmode_compile bitmode_compile.c -m32 - 실행했을때 결과화면 - 64비트용 리눅스 실행 파일로 컴파일하기 gcc -o bitmode_compile bitmode_compile.c -m64 - 실행했을때 결과화면 더보기
파이썬(python)을 사용하여 프로그램에 입력값 넘겨주기 /* written by kaspy (kaspyx@gmail.com)*/ 파이썬을 사용하여 리눅스 및 윈도우의 콘솔 프로그램을 통해 입력 인자를 보다 편리하게 넘겨줄수 있다. 이방법은 보통 S/W 결함 및 Security 테스팅 등에 사용된다. 1. gets() 또는 scanf() 함수 등에 넘길때 #include int main(){ char buf[32]; gets(buf); printf("You enterd string 1: %s\n",buf);}// gcc -o gets_test gets_test.c 위와 같은 코드에 파이썬(python) 스크립트를 사용하여 입력 인자를 넘길수 있다. (python -c 'print "a"*4';cat) | ./gets_test 만약 입력 함수가 여러개라면?? #.. 더보기
Visual Studio 프로그램 배포/재배포 방법 내가 작성한 프로그램은 아무데서나 쉽게 실행이 안된다. 다른곳에서도 실행하게 만드는 방법을 설명하겠다. ** Microsoft Visual C++ 2010 기준 ** 1. Microsoft Visual C++ 2010 재배포 가능 패키지(x86) 를 설치한다. 2. 정적 컴파일을 한다. (용량은 좀 늘어남) 솔루션 탐색기에서 프로젝트를 선택 한뒤, '프로젝트 - 속성 - 구성 속성 - 일반'의 'MFC 사용'을 '정적 라이브러리에서 MFC사용' 로 바꾸고 컴파일을 한다. 또는 동적링크를 정적링크로 수정 프로젝트속성:구성속성:C/C++:코드생성:런타임라이브러리 활성 (Debug) : 다중 스레드 디버그 DLL(/MDd) => 다중 스레드 디버그 (/MTd)활성 (Release) : 다중 스레드 DLL (/.. 더보기
Toybox 오픈소스 프로젝트 참여하기 -2 /* written by kaspy (kaspyx@gmail.com)*/ toybox 공식 홈페이지 : http://www.landley.net/toybox/ - 리눅스 유틸리티 프로그램- BSD License 안녕하세요 이어서 toybox 오픈소스 프로젝트 참여하기 2부를 쓰도록 하겠습니다. 참고로 toybox는 안드로이드 및 타이젠에도 탑재된다고 하니 toybox는 앞으로도 더욱 많이 쓰여질거 같네요!! busybox을 대체하기에도 좋은 툴인거같습니다. 아래 설명은 http://www.landley.net/toybox/code.html 에나와있는 내용을 정리한 내용입니다. 1. Toybox 코딩 스타일 toybox 코딩스타일은 기본적으로 리눅스 커널 코딩 스타일을 따릅니다. 첨부한 vimrc라는 파일.. 더보기
자바(Java)로 구현한 RSA 암호학 알고리즘 예제 /* written by kaspy (kaspyx@gmail.com)*/ RSA는 대단히 수학적인 알고리즘으로 200자리가 넘어가면 슈퍼컴퓨터로 푸는데만해도 1만년이상이 걸린다고 한다. 알고리즘은 두개의 소수 p,q 그리고 (p-1)*(q-1)의 서로소 d를 구하고 p,q,d는 비밀키로 개인이 보관(유출금지)한다. 그리고 p*q 의값 n과 e * d % (p-1)(q-1) = 1을 만족하는 e를 구한다. n과 e는 공개키로 외부에게 공개할수있다. p = 11, q = 17, d = 23e = 7, n = 187 메시지가 m이라고 할때 암호화 c = ( m ^ e ) % n 복호화 d = ( c ^ d) % n 로 구할수있다. 큰 숫자를 다뤄야하는 특성상, 자바 자료형 BigInteger를 사용하여 구현하.. 더보기