본문 바로가기

IT

포맷 스트링 버그(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.. 더보기
자바(java)와 c언어의 차이점 넋두리 그냥 c언어 쓰다가 자바를 쓰다보니 느낀 불편한점 적음 c언어는 자바(java)에 비해 굉장히 자유롭다. 자바가 짜증나는 이유가 있다면 형변환은 엄격히 제한하면서 형변환에 사용되는 유연한 함수가 별로없고 찾기도 어렵다(있겠지만 귀찮다, c언어는 바로 raw data로 처리가 가능한데) 객체 지향 언어라 데이터 변환에 굉장히 엄격하고, 내부 실제 데이터에 접근히기도 어렵다 그리고 일일이 레퍼런스도 찾아봐야한다. 예를들어 RSA 암호화를 구현한다고 해보자. 문자열 "abcde..."라는 평문이 있으면 암호화를 하기위해 이를 "abcde.."를 아스키 코드(숫자)로 변환하고 BigInteger에 넣어야 하는데 이 BigInteger는 String으로만 생성자를 받는다 BigInteger는 int로 생성자를 받.. 더보기
Toybox 오픈소스 프로젝트 참여하기 -1 /* written by kaspy (kaspyx@gmail.com)*/ toybox 공식 홈페이지 : http://www.landley.net/toybox/ - 리눅스 유틸리티 프로그램- BSD License 프로그래머라면 누구나 한번 해보싶은게 오픈소스에 참여하여 자신의 copyright이 새겨 contribution을 하는것을 해보고 싶지 않을까요?? 오픈소스 프로젝트 toybox에 참여하는것도 좋은 방법입니다. 아래 설명은 http://www.landley.net/toybox/code.html 에나와있는 내용을 정리한 내용입니다. 1. 소스코드 clone 하기 오픈소스니까 당연히 소스코드가 공개되어있습니다!! mercurial을 통해서 소스코드를 가져오는방법입니다. (머큐리얼 설치는 'sudo a.. 더보기
파이썬(python) getopt 함수 사용하기 /* written by kaspy (kaspyx@gmail.com)*/ 콘솔용 프로그램을 작성하다보면 같이 입력되는 명령어 인자(파라미터)들을 다루는데 많은 귀찮은 작업이 필요합니다. 여기서 인자들이란 아래와 같이 #-i : 입력 파일 이름#-o : 출력 파일 이름#-c : 특정 조건을 수행하라는 옵션 python example.py -i inputname -o outputname -c 위와 같은 옵션을 처리해야하는 프로그램이라면 sys.argv[1:]의 인자를 파싱해가며 처리해줘야합니다. 이를 좀더 편하게 하기위한 getopt 함수를 사용해봅시다.(설명이 귀찮으면 바로 예제코드 복붙해서 테스트해도 좋은방법입니다) 아래는 getopt 함수의 레퍼런스 입니다. 리턴값은 첫번째 옵션, 그리고 옵션 값으로 .. 더보기
Toybox 오픈소스 프로젝트 소개 /* written by kaspy (kaspyx@gmail.com)*/ toybox 공식 홈페이지 : http://www.landley.net/toybox/ 프로그래머라면 누구나 한번쯤 관심가져볼만한(?)것이 바로 오픈소스 프로젝트에 참여하는거 아닐까요??ㅎㅎ개발이 그리 많이되지않았고, 아직 그렇게 많이 알려지지않은 오픈소스 프로젝트가 있는데 하나 소개할까 합니다. toybox는 리눅스 명령어를 모아둔 유틸리티로써 무료로 배포되는 오픈소스 프로젝트입니다. 2006년부터 개발이 시작되었고 Robert Landley(이하 Rob)에 의해서 유지보수 되고 있습니다. 비슷한 프로젝트로는 busybox나 toolbox 등이 있겠네요. 참고로 Rob은 busybox 프로젝트 참여 멤버로서 있다가 따로 나와서 to.. 더보기
다익스트라(dijkstra) 알고리즘 /* written by kaspy (kaspyx@gmail.com)*/ 방향이 있는 그래프에서 꼭지점들을 연결하는 비용이 할당되었을때 임의의 꼭지점에서 다른 꼭지점으로 가는 경로들 중에서 비용이 가장 적게 드는 경로, 즉 두 정점 사이의 최단 경로를 찾는 문제이다. 이 알고리즘은 음의 간선이 없을 경우에만 적용할수 있다. 욕심쟁이 방법(Greedy Method)을 사용하고있다. 다익스트라 알고리즘은 1959년 컴퓨터 공학자 다익스트라(dijkstra)가 고안해 내었다(이걸로 튜링상 탐, 개2득) - 다익스트라 알고리즘(Dijstra Algorithm) 1. 출발점이 연결된 마디 중에서 가장 가까운 마디를 선택한다.2. 선택된 마디에 연결된 마디까지의 거리와 그 전의 마디에서 선택되지 않은 마디의 거리중.. 더보기
C99 Flexible array member /* written by kaspy (kaspyx@gmail.com)*/ GNU C 컴파일러에는 배열의 크기를 0으로 하고 이를 가변 배열로 메모리로 할당하여 사용하는 경우가 있다. 일명 가변 배열이라고도 하는데 배열의 크기를 유동적으로 정해줄수있다. 대략 아래 코드같이.. 구조체의 멤버 배열의 크기를 "0" 으로 잡고 사용하는 방법인데 C99 전에는 일명 꼼수로 배열크기 1([1]) 사용되어 왔는데 C99 부터는 공식적으로 0의 크기를 주거나 '[]'만 줘서 유동적인 배열크기를 잡을수 있다. struct line { int length; char contents[0]; /* Here */}; struct line *thisline = (struct line *)malloc (sizeof (struct .. 더보기
Winpcap 프로그래밍 :: pcap.h 헤더함수 /* written by kaspy (kaspyx@gmail.com)*/ void pcap_close(pcap_t* p) p와 할당되지 않은 데이터에 연계된 파일을 닫는 함수 int pcap_datalink(pcap_t* p)어댑터의 link layer 값을 반환하는 함수pcap_datalink() 여러 타입의 link layer 값을 반환한다. l DLT_NULL BSD loopback encapsulationl DLT_EN10MB Ethernet (10Mb, 100Mb, 1000Mb, and up)l DLT_IEEE802 IEEE 802.5 Token Ringl DLT_ARCNET ARCNET SLIPl DLT_PPP PPPl DLT_FDDI FDDIl DLT_ATM_RFC1483 RFC 1483 L.. 더보기
TCP 패킷 체크섬(Checksum) C언어로 구현하기 /* written by kaspy (kaspyx@gmail.com)*/ 네트워크 소켓 프로그래밍에서 TCP 및 IP 등에서는 체크섬(checksum)을 통해서 패킷이 변조됬거나 손상됬는지 검사를 해주는 루틴이 있다. 저번장에 이어서, 이번에는 TCP 패킷 체크섬을 구하는 내용을 소개하겠다. 1. 체크섬(Checksum)을 구하는 함수 typedef unsigned char u_char;typedef short SHORT; unsigned short in_checksum(unsigned short *ptr,int nbytes) { register long sum; unsigned short oddbyte; register short answer; sum=0; while(nbytes>1) { sum+=*p.. 더보기
C Generic 함수구현 :: void 포인터와 함수 포인터 이야기 /* written by kaspy (kaspyx@gmail.com)*/ 이번 포스팅에서는 c언어의 Generic 함수 구현을 통해서 void 포인터와 함수 포인터가 왜사용되며 어떻게 사용되는지에 대해 다루어 보겠습니다. 설명하면서 다룬 예제코드는 첨부파일에서 참고 0. 데이터의 교환 아래와 같이 두개의 데이터형이 있다면 이를 서로 교환하기위해서는 int a = 1, b =2 ;int t; t = a;a = b;b = t; 와 같은 형태로 데이터를 바꿀수있으며 이를 함수로 표현하자면 void swap(int *a,int *b){ int t ; t = *a; *a = *b; *b = t;} a=2;b=3;swap(&a,&b); 와같이 구현하여 swap 함수를 구현할수있다. 그런데 여기서 a와 b가 int .. 더보기