설명

수신 또는 전송할 패킷을 덤프하는 간단하는 예제입니다.

네트워크 프로그래밍에서 가장 중요하면서도 기본이 되는게 실제로 패킷이 정상적으로 만들어져서 전송이 됐는지,

반대로 수신받은 패킷이 정상적인지 검증하고 싶을 때 패킷 내용을 직접 봐야하는 경우가 생깁니다.

이럴 때 아주 유용하게 쓸 수 있습니다.

이 코드를 잘 응용하면 파일로 저장된 패킷데이터를 읽어서 출력해볼수 도 있습니다.

아니면 로그 파일로 출력하는 기능을 넣을수도 있습니다.


사용방법

packet_dump.c

int main(int argc, char *argv)
{
    char *buffer = "In the UNIX environment a thread: \n" \
        "Exists within a process and uses the process resources\n" \
        "Has its own independent flow of control as long as its parent process exists and the OS supports it\n" \
        "May share the process resources with other threads that act equally independently (and dependently)\n" \
        "Dies if the parent process dies - or something similar\n";

    packet_dump(buffer, strlen(buffer), 16);
}

실행결과

$ ./packet_dump
[   0] 49 6e 20 74 68 65 20 55-4e 49 58 20 65 6e 76 69   In the UNIX envi
[   1] 72 6f 6e 6d 65 6e 74 20-61 20 74 68 72 65 61 64   ronment a thread
[   2] 3a 20 0d 0a 45 78 69 73-74 73 20 77 69 74 68 69   : ..Exists withi
[   3] 6e 20 61 20 70 72 6f 63-65 73 73 20 61 6e 64 20   n a process and
[   4] 75 73 65 73 20 74 68 65-20 70 72 6f 63 65 73 73   uses the process
[   5] 20 72 65 73 6f 75 72 63-65 73 0d 0a 48 61 73 20    resources..Has
[   6] 69 74 73 20 6f 77 6e 20-69 6e 64 65 70 65 6e 64   its own independ
[   7] 65 6e 74 20 66 6c 6f 77-20 6f 66 20 63 6f 6e 74   ent flow of cont
[   8] 72 6f 6c 20 61 73 20 6c-6f 6e 67 20 61 73 20 69   rol as long as i
[   9] 74 73 20 70 61 72 65 6e-74 20 70 72 6f 63 65 73   ts parent proces
[  10] 73 20 65 78 69 73 74 73-20 61 6e 64 20 74 68 65   s exists and the
[  11] 20 4f 53 20 73 75 70 70-6f 72 74 73 20 69 74 0d    OS supports it.
[  12] 0a 4d 61 79 20 73 68 61-72 65 20 74 68 65 20 70   .May share the p
[  13] 72 6f 63 65 73 73 20 72-65 73 6f 75 72 63 65 73   rocess resources
[  14] 20 77 69 74 68 20 6f 74-68 65 72 20 74 68 72 65    with other thre
[  15] 61 64 73 20 74 68 61 74-20 61 63 74 20 65 71 75   ads that act equ
[  16] 61 6c 6c 79 20 69 6e 64-65 70 65 6e 64 65 6e 74   ally independent
[  17] 6c 79 20 28 61 6e 64 20-64 65 70 65 6e 64 65 6e   ly (and dependen
[  18] 74 6c 79 29 0d 0a 44 69-65 73 20 69 66 20 74 68   tly)..Dies if th
[  19] 65 20 70 61 72 65 6e 74-20 70 72 6f 63 65 73 73   e parent process
[  20] 20 64 69 65 73 20 2d 20-6f 72 20 73 6f 6d 65 74    dies - or somet
[  21] 68 69 6e 67 20 73 69 6d-69 6c 61 72 0d 0a         hing similar..
$

코드


#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

void packet_dump(char* buf, int size, int unit)
{
     char     tmp[150];
     char     msg[256];
     int      i, j, lno;

     j = 7;
     lno = 0;
     memset((tmp+0), 0x00, 150);
     
     for (i = 0; i < size; i++) {
          if((i%unit) == 0)
               memset((tmp+0), 0x20, ((unit*3)+unit+1+7+3));
          if(j == 7)
               sprintf((tmp+0), "[%4d] ", lno);
          sprintf((tmp+j), "%02x", (unsigned char)*(buf+i));
          tmp[j+2] = 0x20;
          if((unsigned char)*(buf+i) >= (unsigned char)0x20)
               tmp[(j/3)+(unit*3)+1+6] = *(buf+i);
          else
               tmp[(j/3)+(unit*3)+1+6] = '.';
          j += 3;
          if((i%unit) == (unit-1)) {
               printf("%s\n", (tmp+0));
               j = 7;
               ++lno;
          }
          else if((i%unit) == ((unit/2)-1))
               tmp[j-1] = '-';
     }
     
     if ((i % unit) != 0) {
     printf("%s\n", (tmp+0));
     }
}

packet_dump 함수 인자 설명


  1. buf: 패킷데이터
  2. size: 패킷데이터의 전체크기 또는 특정크기
  3. unit: 한 라인에 몇 문자씩 보여줄지 결정
이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : app, Application, data, Linux, network, socket, unix

[php]보안팁

Posted 2007/04/14 15:42 by 똥구녕향기
 
register_globals = Off
아직도 많은 국내의 호스팅 업체들에서 register_globals = On 으로 놓고 서비스를 하고 있으나 Off 로 해야 옳다.
물론 이렇게 하면 제로보드처럼 On에서 코딩한 것들은 쓸 수 없게 된다. (제로보드는 쓰지 않는 것이 좋다.)
register_globals = On 으로 놓고서 코드 내에서 따로 보안을 위해 변수를 검사하는 방법도 있겠으나, 그런 이중의 수고를 막으려면 php4 이상에서는 그냥 register_globals = Off 로 하고 그에 따라 코딩해야 한다.

이를테면 $a를 받아서 $b = $a; 로 처리해야 할 때는,
$b=$_GET["a"]; (GET 방식으로넘어온 변수일경우)
$b=$_POST["a"]; (POST 방식으로넘어온 변수일경우)
$b=$_COOKIE ["a"]; (cookie에서 넘어온 값이면)
$b=$_SERVER["a"]; (서버변수일경우)
$b=$_ENV["a"]; (환경변수일 경우)
$b=$_REQUEST["a"]; (서버요청변수일 경우. - GET, POST, Cookie 방식으로 넘어오는 모든 경우에 해당되며, 보안상 권장되지 않는다.)
$b=$_SESSION["a"]; (세션변수이면)
$b=$_FILES["a"]; (file 업로드로 넘어온 변수이면)
와 같이 처리해야 한다.
위 처럼 하기 귀찮을 경우, extract($_GET); 으로 선언하면 $_GET['a']로 들어오는 $a 를 자동으로 인식한다.
♣ 단, SESSION 변수의 경우 절대 extract($_SESSION); 하면 안된다. 보안에 위배되기 때문이다. if (isset($_GET['password'])) { $password = $_GET['password']; echo $password; }
.inc 파일 등 특정 확장자 소스 못보게 하기
아파치 설정파일(httpd.conf) 안에 보면 아래와 같은 라인이 있다.

AddType application/x-httpd-php .php .php3 .html .sql .ph .inc .ins
AddType application/x-httpd-php-source .phps

위에서와 같이 inc를 등록시키면 된다.
그리고 웹브라우저에서 보아도 소스는 나오지 않는다. *.inc 등으로 작성하려거든 반드시 이렇게 해야만 한다. 혹은 *.inc.php 이런 식으로 작성한다.

PHP 보안을 위한 코딩 스타일 (파일 업로드 등)
현재(2002.3) PHP4.1.2 나 PHP4.2.dev 버전을 제외한 모든 버전은 PHP4.1.2로 패치할 것을 권고하고 있다. PHP 파일 업로딩이 RFC 1867에 의해 만들어졌는데, 웹서버를 재부팅 시킬 수도 있다고 한다. PHP4.1.2 이상의 최신 버전이 아닌 모든 버전은 파일 업로드 버그가 존재한다고 한다.

예전 스타일의 파일 업로드를 사용하지 마라; HTTP_POST_FILES 배열과 관련된 함수를 사용해라. PHP 는 특별한 이름을 갖는 어떤 임시디렉토리에 파일을 업로드함으로써 파일 업로드를 지원한다. PHP 는 그 파일 이름이 존재했던 곳을 가리키기 위해 원래 많은 변수들을 설정한다. 그러나 공격자가 변수 이름 및 그 값을 제어할 수 있기 때문에 이들을 사용해 커다란 악영향을 야기할 수 있다. 대신 업로드된 파일에 접근하기 위해서는 언제나 HTTP_POST_FILES 및 관련된 함수를 사용해라. 이 경우라도 PHP 는 공격자가 임의의 내용을 갖는 파일을 업로드할 수 있게 하며 이는 그 자체로 위험함을 주목해라.

모든 입력에 대해 다른 언어에서와 같이 받아들일 수 있는지 패턴과의 일치 여부를 검사하고 그 후 문자열이 아닌 데이타를 요구되는 타입으로 맞추기 위해 타입 캐스팅을 사용해라. (예상되는) 입력의 선택된 리스트를 쉽게 검사하고 import 하기 위해 ``helper" 함수를 개발해라. PHP 는 부정확하게 타입이 정해질 수 있는데 (loosely-typed) 이는 문제를 야기할 수 있다. 예를 들어 입력 데이타가 "000" 값을 갖는다면 이는 "0" 와 같지 않으며 또한 empty() 도 아니다. 이는 특히 결합 (associative) 배열의 경우 중요한데 이들의 인덱스가 문자열이기 때문이다; 이는 $data["000"] 과 $data["0"] 이 다르다는 것을 의미한다. 예를 들어 $bar 가 double 타입임을 확인하기 위해 (double 에 적합한 포맷을 갖는지 확인한 후) 다음과 같이 해라:
$bar = (double) $bar;

위험한 함수에 주의할 것 :
코드실행함수(require(), include(), eval(), preg_replace() 등), 명령실행함수(exec(), passthru(), backtick 연산자, system(), popen() 등), 파일오픈암수(fopen(), readfile(), file()) 등.

PHP에러출력을 방지한다. php.ini의 Error_Handling 부분에서 display_errors = Off 로 설정한다. (오류가 보여지면 apache 디렉토리 위치나 htdocs 디렉토리 위치를 노출시키게 된다.)

magic_quotes_gpc() 를 사용해라. 이는 많은 종류의 공격을 제거한다.

게시판 글올릴때 html소스는 그냥 다 막아버려라. <a>태그 외에 <a onmouse= 등의 태그도 안되고 자바스크립트도 안된다. 그냥 다 막아버리면 제일 속편하다.

phpinfo();는 설치한 후 테스트하고 바로 지워라.

쿠키보다는 세션을, 세션보다는 autu인증을 사용하라.

location.replace 인증 (이동했던 히스토리 삭제) function goto_page($url) { echo "<script> location.replace('.$url.');</script>"; }

쇼핑몰 등의 사이트는 반드시 SSL을 사용하라.

디렉토리는 755대신 711로 설정. 그리고 될수있으면 아파치 httpd.conf 에서 Indexes 지운다. (index.html 파일이 없을 경우 디렉토리 목록이 출력되는 것을 방지.)

(보안) 세션, 자료실, PHP_SELF
(출처:
http://tood.net)
php.ini 에서 register_globals = Off 로 설정했다면 세션의 등록은 아래와 같이 한다. <?php session_start(); $HTTP_SESSION_VARS['foo'] = "blah blah"; // $_SESSION['foo'] = "blah blah"; // $_SESSION은 PHP4.1.0 이상이다. session_register('foo'); ?>

회원 비번은 md5()로 암호화하고 php.ini에서 세션저장장소를 /tmp가 아닌 다른 장소에 저장한다. (보안을 위해)
세션 생성 시 $userid를 생성하고, $userpass = md5($userpass); 로 생성해서, 2개 값이 있는지 비교하고 isset()등으로 비교하는게 좋다.
$userpass값은 md5()로 해싱하면 32자가 되므로 길이를 확인한다.

if((session_is_registered(username)) && (session_is_registered(user_id)))
으로 체크. <?php function check_session() { session_start(); if (session_is_registered(user_id)) { return TRUE; } else { header("Location: login.php"); exit; } } ?>

파일의 경우는 $HTTP_POST_FILES 를 따로 해야 한다. extract($HTTP_POST_FILES); foreach ($HTTP_POST_FILES as $UploadedFile ) { $UploadedFile_name = $UploadedFile['name']; $UploadedFile_size = $UploadedFile['size']; $UploadedFile_type = $UploadedFile['type']; }

특히 파일의 경우 절대로 GET으로 올리지 못하게 해야한다.
upload.php?file_name=/etc/passwd$file_type=text&file_size=30
이런 식으로 해킹할 시스템의 passwd파일을 자료실에 올려버리고 다운받는 경우가 있기 때문이다. 아예 파일명 중에 pass나 shadow등이 있을 경우 올리지 못하게 하는 방법도 있다.
또는 file_exists($file_name)를 사용하여 체크한다. 로컬 시스템에 파일이 있으면 절대 못올리게 되는 것이다.

$PHP_SELF의 경우도 바로 출력되지 않는다. $_SERVER['REQUEST_METHOD']; //GET or POST $_SERVER['REQUEST_URI']; $_SERVER['PHP_SELF'];

링크로 넘어오는 값 확인
( 출처 :
http://www.nzeo.com/bbs/zboard.php?id=cgi_tip&page=2&sn1=&divpage=1&sn=off&ss=on&sc=off&keyword=링크&select_arrange=headnum&desc=asc&no=1030 ) if(!eregi(getenv("HTTP_HOST"),getenv("HTTP_REFERER"))) { $reffer = getenv("HTTP_REFERER"); echo "<script>alert('여기다 무단링크시 남길 메세지');window.location.href='http://4rum.uu.st (홈주소)';</script>"; $filename = "기록할 파일 이름"; if (!file_exists($filename)) touch ("$filename"); chmod($filename,0777); $fp = fopen($filename,"a+"); if (!trim($reffer)) $reffer = "Typing or Bookmark"; fwrite($fp,"IP : $REMOTE_ADDR , REFFER : $reffer\n"); fclose($fp); exit; }

자료실에서 무단링크, 웹상에서 실행을 막는 한 가지 방법
자료를 업로드 할 때 원래이름과 바꿀이름 2가지를 디비에 저장한다. 그리고 다운로드를 받을 때는 디비에서 원래 이름을 가져와서 헤더 함수를 이용해 파일명을 원래이름으로 바꿔서 보냅니다.. 이렇게하면 저장되어있는 파일이름을 알 수가 없기때문에 무단링크, 웹상에서 실행이 불가능 하게된다. 파일이름을 안다고 해도 웹상에서는 실행되자 않는다. (아파치가 인식할 수 없는 확장자명으로 지정했을경우) 그러니까 파일을 저장할때 파일명을 $filename = date("YmdHis").".down"; 으로 한다. 그럼 200101231203.down 이런 식으로 파일명이 된다.

PHP파일문서를 자료실에 올리는 문제 (불완전정보)
자료실에 확장자 php인 자료를 올려 해당 서버의 정보를 유출하거나 자료를 삭제하는 해킹이 있을 수 있다. 이 때는 php를 사용할 디렉토리를 정한 후 모든 php소스는 그 디렉토리 밑에 두어야 한다.

예를 들어 자신의 Document Root 디렉토리가 '/home/aaa/public_html'이라면 public_html 아래에 php란 디렉토리를 만든다. 그런 다음 아파치 웹 서버의 설정파일 httpd.conf 를 다음과 같이 수정한다.

<Directory "/home/aaa/public_html"> ... php_admin_flag engine off ... </Directory> <Directory "/home/aaa/public_html"> ... php_admin_flag engine off ... </Directory>

위와 같이 설정하고 나머지 자료 아래의 html파일은 모두 php디렉토리 밖에 놓아두면 아무런 문제없이 php를 사용할 수 있을 것이다. 또 다른 방법은 자료를 올릴 때 php 파일은 전혀 등록할 수 없게 하는 방법인데 이 부분은 좀 애매한 부분이다.
이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : php, 관리, 리눅스, 보안, 서버, 유지

[유머]그래도 우리는 게임을 만든다.ㅋ

Posted 2007/04/10 19:25 by 똥구녕향기
사용자 삽입 이미지
이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : 유머

[슷하크레프르][유머]공감공감

Posted 2007/04/08 14:45 by 똥구녕향기

사용자 삽입 이미지
ㅋㅋㅋㅋㅋ

절대적 공감....


이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : 비애, 스타크레프트, 유머, 조삼모삼, 패러디

butiful mind... 뷰티풀 마인드.. 천재 수학가 존네쉬

Posted 2007/04/04 01:12 by 똥구녕향기
사용자 삽입 이미지
사용자 삽입 이미지


존내쉬 - 천재 수학가. 1994년 노벨경제학상 수상자.

뷰티풀마인드

"저는 항상 숫자와 방정식 논리가 인간의 이성을 이끌어 간다고 믿었죠.
하지만 평생 그것을 추구하고 나서 물었습니다.
무엇이 진정한 논리이며 누가 이성을 경정하는지를요 .
제가 그걸 탐구하는동안육체와 정신의 환상들이 반복되어 나타났죠.
저의 연구활동중에서 가장 중요한것을 발견하였습니다.
제인생의 가장 중요한 발견은 신비로운 헌신적인 사랑이었습니다.
거기엔 어떤논리적 이론도 없었습니다.
그리고 난깨달았습니다.
바로 당신때문에...
당신은 내존재의 이유이고 나의 모든이유는 당신입니다.
고맙습니다."

- 영화 뷰티풀 마인드 중에서 -

이영화에서 마지막 장면에 나온 늙은 모습의 존네쉬 그는 평생을 방정식과 숫자에 둘러쌓인채로 살아왔다 그결과 그는 수십년동안 정신분열증을 앓았다. 하지만 그는 굳은 신념으로 사회 여러 분야에 자신의 업적을 남겼으며 아직도 그는 교수로서 활동중이다.

나는 이영화 보는 내내 답답했다. 이영화에서 초반 중반까지 나오는 혼란스러운것들
내머리속에서 정리가 되지 않고 중간중간의 반전들때문에 이해하기가 어려웠다.
하지만 이영화의 마지막을 보면서 모든걸 알았다.
마지막에서의 저대사는 자신의 평생의 연구결과에서도 얻지 못한것을 자신의 인생에서 발견한것이다.

사용자 삽입 이미지
그는 천재 수학가 이전에 사람이었다.

나도 사람이다... 해보자...!!!
이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : 노벨 경제학상 수상자, 러셀 크로우, 뷰티풀마인드, 수학가, 존 네쉬

[c/c++][app][move util] move algorythm

Posted 2007/04/03 10:24 by 똥구녕향기

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

#define ERR_MSG "usage : move file1 file2\n"

int main(int argc ,char *argv[]){

 if(argc != 3){
  fprintf(stderr,"%s",ERR_MSG);
  exit(1);
 }
 
 else{
  if(link(argv[1],argv[2])==-1){
   perror("LINK ERROR :");
   exit(1);
  }
 
  if(unlink(argv[1])==-1){
   perror("UNLINK_ERR : REMOVE FILE IMPOSBLE");
   exit(1);
  }
 
  printf("SUCCESS MOVE : %s -> %s",argv[1],argv[2]);
  exit(0);
 }
 return 0;
}
 
 

이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : instruction, Linux, move, mv, unix, 기초, 명령어

void PrintNetData(FILE * fp, u_char * start, const int len)
{
    char *end;          /* ptr to buffer end */
    int i;          /* counter */
    int j;          /* counter */
    int dbuf_size;      /* data buffer size */
    int done;           /* flag */
    char *data;         /* index pointer */
    char *frame_ptr;        /* we use 66 byte frames for a printed line */
    char *d_ptr;        /* data pointer into the frame */
    char *c_ptr;        /* char pointer into the frame */
    char conv[] = "0123456789ABCDEF";   /* xlation lookup table */

    /* initialization */
    done = 0;

   /* zero, print a <CR> and get out */
    if(!len)
    {
        fputc('\n', fp);
        return;
    }

    if(start == NULL)
    {
        printf("Got NULL ptr in PrintNetData()\n");
        return;
    }
  
    end = (char*) (start + (len - 1));    /* set the end of buffer ptr */

    if(len > IP_MAXPACKET)
    {
        if(pv.verbose_flag)
        {
            printf("Got bogus buffer length (%d) for PrintNetData, defaulting to 16 bytes!\n", len);
        }

        if(pv.verbose_bytedump_flag == 1)
        {
            dbuf_size = (FRAME_SIZE + 8) + (FRAME_SIZE + 8) + 1;
        }
        else
        {
            dbuf_size = FRAME_SIZE + FRAME_SIZE + 1;
        }

        /* dbuf_size = 66 + 67; */
        end =  (char*) (start + 15);
    }
    else
    {
        if(pv.verbose_bytedump_flag == 1)
        {
            /* figure out how big the printout data buffer has to be */
            dbuf_size = ((len / 16) * (FRAME_SIZE + 8)) + (FRAME_SIZE + 8) + 1;
        }
        else
        {
            /* figure out how big the printout data buffer has to be */
            dbuf_size = ((len / 16) * FRAME_SIZE) + FRAME_SIZE + 1;
        }

        /* dbuf_size = ((len / 16) * 66) + 67; */
    }

    /* generate the buffer */
    //data_dump_buffer = (char *) malloc(dbuf_size);
    if (data_dump_buffer == NULL)
    {
        AllocDumpBuf();
    }

    /* clean it out */
    memset(data_dump_buffer, 0x20, dbuf_size);

    /* set the byte buffer pointer to step thru the data buffer */
    data = (char*) start;

    /* set the frame pointer to the start of the printout buffer */
    frame_ptr = data_dump_buffer;

    /* initialize counters and frame index pointers */
    i = 0;
    j = 0;

    /* loop thru the whole buffer */
    while(!done)
    {
        if(pv.verbose_bytedump_flag == 1)
        {
            d_ptr = frame_ptr + 8;
            c_ptr = (frame_ptr + 8 + C_OFFSET);
            sprintf(frame_ptr, "0x%04X: ", j);
            j += 16;
        }
        else
        {
            d_ptr = frame_ptr;
            c_ptr = (frame_ptr + C_OFFSET);
        }

        /* process 16 bytes per frame */
        for(i = 0; i < 16; i++)
        {
            /*
             * look up the ASCII value of the first nybble of the current
             * data buffer
             */
            *d_ptr = conv[((*data & 0xFF) >> 4)];
            d_ptr++;

            /* look up the second nybble */
            *d_ptr = conv[((*data & 0xFF) & 0x0F)];
            d_ptr++;

            /* put a space in between */
            *d_ptr = 0x20;
            d_ptr++;

            /* print out the char equivalent */
            if(*data > 0x1F && *data < 0x7F)
                *c_ptr = (char) (*data & 0xFF);
            else
                *c_ptr = 0x2E;

            c_ptr++;

            /* increment the pointer or finish up */
            if(data < end)
                data++;
            else
            {
                *c_ptr = '\n';
                c_ptr++;
                *c_ptr = '\n';
                c_ptr++;
                *c_ptr = 0;

                dump_size = (int) (c_ptr - data_dump_buffer);
                fwrite(data_dump_buffer, dump_size, 1, fp);

                //ClearDumpBuf();
                return;
            }
        }

        *c_ptr = '\n';
        if(pv.verbose_bytedump_flag == 1)
        {
            frame_ptr += (FRAME_SIZE + 8);
        }
        else
        {
            frame_ptr += FRAME_SIZE;
        }
    }

    //ClearDumpBuf();
}

void PrintCharData(FILE * fp, char *data, int data_len)
{
    int bytes_processed;    /* count of bytes in the data buffer
                 * processed so far */
    int linecount = 0;      /* number of lines in this dump */
    char *index;        /* index pointer into the data buffer */
    char *ddb_ptr;      /* index pointer into the data_dump_buffer */
    int size;

    /* if there's no data, return */
    if(data == NULL)
    {
        return;
    }

    /* setup the pointers and counters */
    bytes_processed = data_len;
    index = data;

    /* allocate a buffer to print the data to */
    //data_dump_buffer = (char *) calloc(data_len + (data_len >> 6) + 2, sizeof(char));
    if (data_dump_buffer == NULL)
    {
        AllocDumpBuf();
    }

    size = (data_len + (data_len >> 6) + 2) * sizeof(char);

    /* Based on data_len < 65535, this should never happen, but check just in
     * case sizeof(char) is big or something. */
    if (data_dump_buffer_size < size)
    {
        data_dump_buffer_size = size;
        ClearDumpBuf();

        /* Reallocate for a bigger size. */
        AllocDumpBuf();
    }

    /* clean it out */
    memset(data_dump_buffer, 0x20, size);

    ddb_ptr = data_dump_buffer;

    /* loop thru the bytes in the data buffer */
    while(bytes_processed)
    {
        if(*index > 0x1F && *index < 0x7F)
        {
            *ddb_ptr = *index;
        }
        else
        {
            *ddb_ptr = '.';
        }

        if(++linecount == 64)
        {
            ddb_ptr++;
            *ddb_ptr = '\n';
            linecount = 0;
        }
        ddb_ptr++;
        index++;
        bytes_processed--;
    }

    /* slam a \n on the back */
    ddb_ptr++;
    *ddb_ptr = '\n';
    ddb_ptr++;

    /* setup the globals */

    dump_size = (int) (ddb_ptr - data_dump_buffer);
    fwrite(data_dump_buffer, dump_size, 1, fp);

    //ClearDumpBuf();
}

이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : Analysis, data, packet, Security!, snort, 보안

[c/c++][socket programing]socket() 함수

Posted 2007/03/31 14:50 by 똥구녕향기

1.1절. 사용법

#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
		


1.2절. 설명

통신을 위한 종점(endpoint)를 생성하기 위해서 사용한다. 성공적으로 함수를 수행했을경우, 통신 종점으로 사용될 파일 지시자를 리턴한다.

socket() 를 통해서 만들어진 파일 지시자는 보통 클라이언트의 연결을 듣기 위해서 사용됨으로 "듣기 소켓" 이라고 불리우기도 한다.

domain(도메인) 은 통신 도메인(영역)을 지정하기 위해서 사용한다.

AF_UNIX

유닉스 도메인 소켓으로 IPC 용으로 사용한다.

AF_INET

TCP/IP 프로토콜을 이용한 일반적인 인터넷 통신용으로 주로 사용된다. AF_UNIX 와 함께 가장 일반적으로 사용된다.

AF_IPX

노벨의 IPX 프로토콜의 사용을 위해서 사용한다.

AF_X25

X.25 프로토콜

AF_AX25

아마추어 라디오 X.25

type 은 통신에 사용될 패킷의 타입을 지정하기 위해서 사용한다.

SOCK_STREAM

연결지향의 TCP 프로토콜

SOCK_DGRAM

데이타그램 지향의 UDP 프로토콜

SOCK_RAW

생소켓 혹은 날소켓으로 불리우는 저수준 socket 제어 프로토콜

protocol 은 소켓을 사용하기 위한 프로토콜 지정을 위해 사용한다.


1.3절. 반환값

성공할경우 정수의 파일 지시자, 실패할경우 -1이 반환된다.


1.4절. 에러

EPROTONOSUPPORT

지정된 프로토콜 타입 혹은 프로토콜이 해당 도메인에서 지원되지 않을경우

ENFILE

새로운 소켓구조를 지정하기 위해 커널 메모리가 부족

EMFILE

프로세스 파일 테이블이 overflow

EACCES

지정된 타입의 생성된 소켓이나 프로토콜 권한이 거부되었을경우, 대표적으로 RAW 소켓은 root 권한이 있어야 생성가능하다.

EINVAL

알려지지 않은 프로토콜을 사용했을 경우


1.5절. 예제

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
    int server_sockfd, client_sockfd;
    int state, client_len;

    struct sockaddr_in clientaddr, serveraddr, myaddr;


    // internet 기반의 스트림 소켓을 만들도록 한다. 
    // server_sockfd 는 endpoint 소켓(듣기 소켓) 으로 사용된다. 
    if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("socket error : ");
        exit(0);
    }
    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serveraddr.sin_port = htons(12345);

    // 듣기 소켓에 소켓특성(주소, 포트)를 묶어준다. 
    state = bind(server_sockfd , (struct sockaddr *)&serveraddr, 
            sizeof(serveraddr));
    if (state == -1)
    {
        perror("bind error : ");
        exit(0);
    }

    state = listen(server_sockfd, 5);
    if (state == -1)
    {
        perror("listen error : ");
        exit(0);
    }

    // 만약 듣기 소켓으로 클라이언트 연결이 들어왔다면, 
    // 새로운 클라이언트와의 통신을 위한 소켓 지정번호를 할당한다. 
    client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr, 
                           &client_len);
    if (client_sockfd == -1)
    {
        perror("Accept error : ");
        exit(0);
    }
    // 여기에서 부터는 클라이언트와의 통신
    // .....
    // .....

    close(client_sockfd);
    return 1;
}

이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : network, socket, system library

[c/c++][socket programing]sendto()사용하기.

Posted 2007/03/31 14:49 by 똥구녕향기

1.1절. 사용법

#include <sys/types.h>
#include <sys/socket.h>

int  sendto(int s, const void *msg, size_t len, int flags,
       const struct sockaddr *to, socklen_t tolen);
		


1.2절. 설명

이함수는 다른 소켓으로 메시지를 보내기 위해서 사용된다. 이 함수는 연결지향소켓(TCP)과 그렇지않은 소켓타입(UDP) 모두에 사용가능하다.

s는 메시지를 보내고자 하는 소켓의 지정자이다.

msg는 보내고자 하는 메시지이며, len는 메시지의 길이이다.

to는 보내고자하는 곳의 주소정보를 가지고 있다. 사실 연결지향이라면 연결된 소켓을 통해서 그냥 쓰기만 하면 됨으로 이 정보는 필요없다(NULL), 그러나 연결지향이 아닌 UDP와 같은 연결일경우 주소구조체를 채워주어야만 제대로 메시지가 전달될 것이다. tolen는 sockaddr 구조체의 크기이다.

flags는 다음중 선택해서 지정할수 있다.

MSG_OOB

oub-of-band data를 이 개념을 지원하는 소켓으로 보낸다.

MSG_DONTROUTE

패킷을 전송하는데 게이트웨이를 사용하지 않고 직접 연결된 네트워크를 통해서 호스트로 보낸다. 이것은 diagnostic 혹은 routing 프로그램에 의해서만 사용한다.

MSG_DONTWAIT

non-blocking을 가능하게 한다.

MSG_NOSIGNAL

다른 한쪽의 소켓의 연결이 끊겼을때, 소켓으로부터 발생하는 스트림상의 SIGPIPE를 보내지 않도록 요구한다. 그러나 EPIPE에러는 여전히 반환된다.


1.3절. 반환값

성공할경우 0을 실패했을경우에는 -1을 반환하며, 적당한 errno 값을 설정한다.


1.4절. 에러

EBADF

s 가 유효한 기술자가 아니다.

ENOTSOCK

s 가 소켓이 아닌 파일일경우

EFAULT

실제하지 않는 사용자 공간주소가 매개변수로 지정되었다.

EINTR

신호발생으로 인하여 인터럽트가 걸렸다.

EPIPE

연결된 소켓이 깨졌다. MSG_NOSIGNAL이 설정되어 있지 않을경우 프로세스는 SIGPIPE신호를 받게 된다.


1.5절. 예제

#include <sys/socket.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    int server_sockfd, client_sockfd;
    int client_len, n;
    char buf[80];
    struct sockaddr_in clientaddr, serveraddr;

    client_len = sizeof(clientaddr);

    if ((server_sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("socket error : ");
        exit(0);
    }
    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serveraddr.sin_port = htons(atoi(argv[1]));

    bind (server_sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
    listen(server_sockfd, 5);

    while(1)
    {
        memset(buf, 0x00, 80);
        client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr,
                            &client_len);

        if ((n = read(client_sockfd, buf, 80)) <= 0)
        {
            close(client_sockfd);
            continue;
        }
        sendto(client_sockfd,(void *)buf, 80, 0,
                        NULL, client_len);
        close(client_sockfd);
    }
}
		
telnet으로 간단하게 테스트할수 있는 echo 서버이다.

--출저 joinc wiki (함수모음)-system library

이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : network, sendto, socket, system library, TCP/IP, udp

FERRARI 599 GTB FIORANO--펌(네이버)

Posted 2007/03/31 14:34 by 똥구녕향기
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
1996년에 발매되어 5700대에 달하는 판매를

페라리 599 GTB 피오라노

가격 2억 4천 974만원(유로)
엔진

V12, 48밸브, DOHC

5999cc

변속기 6단 자동
사이즈 4665x1962x1336mm
휠 베이스 2750mm
총 중량 1688kg
출력 620ps/7600rpm
토크 62.0kg-m/5600rpm
0-100km 3.7초
최대 시속 330km
구동 FR
연비 21.3L/100km
* 제원은 참고사항으로써, 실제 차량과 다를수 있습니다.
기록했던 '550 마라넬로'의 후속으로 이탈리아 페라리 사에서 V12 엔진탑재의 최신 쿠페 모델 '페라리 599 GTB 피오라노'를 발표했다.

'2006 제네바 모터쇼'에서 첫 선을 보인이 모델에는 미국의 알루미늄 생산 및 제조업체인 알코아 사와 공동으로 개발해 약 40%가량의 경량화를 이루는 알루미늄 스페이스 프레임을 채용해, V12 엔진의 탑재에도 47대 53의 전후 배분량으로 1688kg의 중량을 실현하고 있다.

바디사이즈는 전체길이와 전폭, 전고4665x1962x1336mm에 휠베이스 2750mm.
 전후 트레드는 1689mm, 1618mm이다.

 탑재 엔진에는 '엔쵸 페라리'에 탑재되었던 'F140B' 엔진의 부품을 변경하며 개량을 이루고, 보아와 스트로크 91.9x75.2mm의 5999cc 65도 V12로 구성된 개량형 'F140C' 엔진이다. 또한 여기에 밸브 타이밍 기구를 부착해 프론트 미드쉽에 탑재하며, 퍼포먼스로 (620ps)612hp와 62.0kg-m의 고출력을 발휘하게된다.

트랜스미션에는 6단 수동변속기와 F1 패들시프트가 부착되며, 이중 F1 패들 시프트는 일명 'F1 슈퍼 패스트'라는 이름의 2세대 자동변속기로.. 모터스포츠 F1 표뮬러원에 도입했던 시스템과 동일해 압도적인 변속 타이밍을 보인다.

이러한 구성으로 0-100km까지의 순간가속도를 3.7초, 0-200km까지는 11.0초, 그리고 최대시속은 330km의 압도적인 성능을 보이는 동시에 정숙성이 뛰어난 엔진에 진동이 적어 다루기 쉽다는 것이 포인트다.

 차량의 구조는 FR의 2도어 2인승이며, 물론 디자인은 피닌파리나에서 담당해 선대 '575M 마라넬로'보다 저중심화를 추구하며 에어로 스타일을 적용해 330km 속도에서 다운포스와 양력을 최적화시킨다고 말한 페라리의 철학을 밑바탕으로 하고있다. 뿐만아니라 'F1 트랙'이라고 불리우는 '스태빌리티 컨트롤'을 장착해 '레이스'와 '스포츠' 모드로의 설정이 가능하다.

'레이스' 모드의 경우 하이퍼포먼스를 극한까지 발휘시키게되며, '스포츠' 모드는 전후 휠이 회전하는 속도를 모니터링하며 최대한의 그립까지 안전하게 컨트롤해내고있다. 타이어에는 피렐리 P제로 245/40Z R 19, 305/35Z R 20을 전후에 신게되며, 타이어의 압력과 온도를 모니터링 할수도 있다고. 비록 최대출력은 '엔쵸 페라리'에 뒤지지만 엔진의 부드러움은 '599 피오라노'가 한수위다.
 
델파이 사와 공동으로 개발해 '마그네토리올로지컬 서스팬션 컨트롤 SCM'의 채용으로 노면 추종성이대폭 향상되고 있어 승차감이 상당히 쾌적하다. 6단 자동변속기 'F1 슈퍼 패스트'는 놀라울 정도로변속 타이밍이 빨라 쇼크도 전혀없고, 슬라이드 상태를 유지하는 트랙션 컨트롤도 절묘하게 발휘되고있다.

그리고 앞에서도 말했던 정숙성으로 시속 200km의 시점에서는 사이드미러가 바람을 가르는 소음을 신경써야 할정도다. 최대시속으로의 주행에서 느껴지는 안정감은 '람보르기니 무르시엘라고'을 약간 능가하는 정도지만, 그렇다고 직접적으로 라이벌 경쟁모델을 '무르시엘라고'라고 말할순없다.

속도를 마음껏 즐길수있는 서킷 주행을 시작으로 공도에서의 주행까지 완벽하게 처리하는 '599 GTB 피오라노'의 완성도는 기존 슈퍼스포츠카의 상식을 깨는 레벨에 도달하고있어, 현재까지 '599 GTB 피오라노'를 보았을때 느껴지는 경쟁대상에 대한 생각에는 '599 GTB 피오라노'자신밖엔 보이지않는다. '575M 마라넬로'의 후속으로 페라리의 이름에 부끄럽지않은 성능을 갖추며, 한편으로는 고급 세단에도 대응할만큼 뛰어난 승차감과 정숙성을 실현하는 '599 GTB 피오라노'는 '이것을 뛰어넘을 자동차가 당분간은 나오지 않을것'이라는 생각이 들게할 정도로 완성도 높고, 전체적인 밸런스는 기존 모델들을 뿌리칠수있는 최정상급의 뛰어난 레벨에 도달하고있다.

출처 : 네이버블로그 ㅡ 카스파이샷
이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : FERRARI 599 GTB FIORANO, 페라리

« PREV : 1 : 2 : 3 : NEXT »