+===============================================================+ | Binary Code¸¦ ºÐ¼®Çϱ⠱âÃÊÆí | | 2002.08.20. -Anesra in Null@Root- | | anesra@null2root.org | +===============================================================+ Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-85) Linux willcan 2.4.3-12 #1 Fri Jun 8 15:05:56 EDT 2001 i686 unknown ---index--- 1. main() 2. if¹® - if¹®& ºñ±³¹® Á¤¸® 3. for¹® - ´ÜÀÏfor¹®&ºñ±³¹® Á¤¸® 4. while¹® - while¹® Á¤¸® 1. main() 0x8048430
: push %ebp 0x8048431 : mov %esp,%ebp 0x8048433 : pop %ebp 0x8048434 : ret 0x8048435 : lea 0x0(%esi),%esi main() { } ------------------------------------------------ 0x8048430
: push %ebp 0x8048431 : mov %esp,%ebp 0x8048433 : pop %ebp 0x8048434 : ret 0x8048435 : lea 0x0(%esi),%esi int main() { } ------------------------------------------------ 0x8048430
: push %ebp 0x8048431 : mov %esp,%ebp 0x8048433 : pop %ebp 0x8048434 : ret 0x8048435 : lea 0x0(%esi),%esi int main(int argc, char *argv[]) { } ------------------------------------------------ 0x8048430
: push %ebp 0x8048431 : mov %esp,%ebp 0x8048433 : sub $0x4,%esp 0x8048436 : leave 0x8048437 : ret main() { int i; } ------------------------------------------------ 0x8048430
: push %ebp 0x8048431 : mov %esp,%ebp 0x8048433 : sub $0x8,%esp 0x8048436 : leave 0x8048437 : ret main() { int i,j; } ------------------------------------------------ 0x8048430
: push %ebp 0x8048431 : mov %esp,%ebp 0x8048433 : sub $0x4,%esp 0x8048436 : leave 0x8048437 : ret main() { long addr; } ---------------------------------------------------- 0x8048460
: push %ebp 0x8048461 : mov %esp,%ebp 0x8048463 : sub $0x8,%esp 0x8048466 : sub $0xc,%esp 0x8048469 : push $0x0 0x804846b : call 0x8048348 main() { exit(0); } ---------------------------------------------------------------- 0x8048430
: push %ebp 0x8048431 : mov %esp,%ebp 0x8048433 : mov $0x0,%eax 0x8048438 : pop %ebp 0x8048439 : ret 0x804843a : mov %esi,%esi int main() { return 0; } ---------------------------------------------------------------- 0x8048430
: push %ebp 0x8048431 : mov %esp,%ebp 0x8048433 : mov $0x1,%eax 0x8048438 : pop %ebp 0x8048439 : ret 0x804843a : mov %esi,%esi main() { return 1; } ---------------------------------------------------- 0x8048460
: push %ebp 0x8048461 : mov %esp,%ebp 0x8048463 : sub $0x8,%esp 0x8048466 : cmpl $0x1,0x8(%ebp) 0x804846a : jg 0x8048478 if(argc < 2) 0x804846c : sub $0xc,%esp 0x804846f : push $0x0 0x8048471 : call 0x8048348 0x8048476 : mov %esi,%esi exit(0); 0x8048478 : leave 0x8048479 : ret 0x804847a : mov %esi,%esi #include int main(int argc, char *argv) { if(argc < 2) exit(0); } ---------------------------------------------------- 0x8048460
: push %ebp 0x8048461 : mov %esp,%ebp 0x8048463 : sub $0x8,%esp 0x8048466 : cmpl $0x2,0x8(%ebp) 0x804846a : jg 0x8048478 if(argc <= 2 ) 0x804846c : sub $0xc,%esp 0x804846f : push $0x1 0x8048471 : call 0x8048348 0x8048476 : mov %esi,%esi 0x8048478 : leave 0x8048479 : ret 0x804847a : mov %esi,%esi main(int argc, char *argv[]) { if(argc <= 2) exit(1); } ---------------------------------------------------- 2. if¹® 0x8048490
: push %ebp 0x8048491 : mov %esp,%ebp 0x8048493 : sub $0x8,%esp 0x8048496 : cmpl $0x2,0x8(%ebp) 0x804849a : jle 0x80484a8 // if(argc > 2) 0x804849c : sub $0xc,%esp 0x804849f : push $0x0 0x80484a1 : call 0x804837c 0x80484a6 : mov %esi,%esi // exit(0); 0x80484a8 : sub $0xc,%esp 0x80484ab : push $0x8048528 0x80484b0 : call 0x804835c 0x80484b5 : add $0x10,%esp // printf("Input Arg\n"); 0x80484b8 : leave 0x80484b9 : ret 0x80484ba : mov %esi,%esi (gdb) x/s 0x8048528 0x8048528 <_IO_stdin_used+4>: "Input Arg\n" main(int argc, char *argv[]) { if(argc > 2) exit(0); printf("Input Arg\n"); } ---------------------------------------------------- 0x8048460
: push %ebp 0x8048461 : mov %esp,%ebp 0x8048463 : sub $0x8,%esp 0x8048466 : cmpl $0x1,0xfffffffc(%ebp) 0x804846a : jle 0x804847c 0x804846c : sub $0xc,%esp 0x804846f : push $0x80484e8 0x8048474 : call 0x804833c 0x8048479 : add $0x10,%esp 0x804847c : leave 0x804847d : ret 0x804847e : mov %esi,%esi 0x80484e8 <_IO_stdin_used+4>: "I >=2\n" main() { int i; if(i >= 2) printf("I >=2\n"); } ---------------------------------------------------- 0x8048490
: push %ebp 0x8048491 : mov %esp,%ebp 0x8048493 : sub $0x8,%esp 0x8048496 : cmpl $0x2,0x8(%ebp) 0x804849a : jne 0x80484a8 0x804849c : sub $0xc,%esp 0x804849f : push $0x0 0x80484a1 : call 0x804837c 0x80484a6 : mov %esi,%esi 0x80484a8 : sub $0xc,%esp 0x80484ab : push $0x8048528 0x80484b0 : call 0x804835c 0x80484b5 : add $0x10,%esp 0x80484b8 : leave 0x80484b9 : ret 0x80484ba : mov %esi,%esi main(int argc, char *argv[]) { if(argc == 2) exit(0); printf("Input Arg\n"); } ---------------------------------------------------- 0x8048460
: push %ebp 0x8048461 : mov %esp,%ebp 0x8048463 : sub $0x8,%esp 0x8048466 : cmpl $0x2,0x8(%ebp) 0x804846a : je 0x8048478 if(argc !=2 ) 0x804846c : sub $0xc,%esp 0x804846f : push $0x0 0x8048471 : call 0x8048348 0x8048476 : mov %esi,%esi 0x8048478 : leave 0x8048479 : ret 0x804847a : mov %esi,%esi main(int argc, char *argv[]) { if(argc !=2 ) exit(0); } ============================================================= if¹®& ºñ±³¹® Á¤¸® +-----------------------------------------------------------+ | if(argc < n ) | cmpl $0xn-1,0x8(%ebp) | | | jg 0x8048478 if¹® ¹ÛÀ¸·Î | +-----------------------------------------------------------+ | if(argc <= n) | cmpl $0xn,0x8(%ebp) | | | jg 0x8048478 if¹® ¹ÛÀ¸·Î | +-----------------------------------------------------------+ | if(argc > n) | cmpl $0xn,0x8(%ebp) | | | jle 0x80484a8 if¹® ¹ÛÀ¸·Î | +-----------------------------------------------------------+ | if(argc >= n) | cmpl $0xn-1,0x8(%ebp) | | | jle 0x80484a8 if¹® ¹ÛÀ¸·Î | +-----------------------------------------------------------+ | if(argc == n) | cmpl $0xn,0x8(%ebp) | | | jne 0x80484a8 if¹® ¹ÛÀ¸·Î | +-----------------------------------------------------------+ | if(argc != n) | cmpl $0xn,0x8(%ebp) | | | je 0x80484a8 if¹® ¹ÛÀ¸·Î | +-----------------------------------------------------------+ ============================================================= 3. for¹® ---------------------------------------------------- 0x8048460
: push %ebp 0x8048461 : mov %esp,%ebp 0x8048463 : sub $0x8,%esp 0x8048466 : nop 0x8048467 : movl $0x1,0xfffffffc(%ebp) 0x804846e : mov %esi,%esi for(i = 1 0x8048470 : cmpl $0x9,0xfffffffc(%ebp) 0x8048474 : jle 0x8048478 0x8048476 : jmp 0x8048494 // i°ªÀÌ 9º¸´Ù À۰ųª °°À¸¸é for¹® ³»ºÎ·Î // ±×·¸Áö ¾ÊÀ¸¸é(10º¸´Ù Å©¸é) for¹® ¹ÛÀ¸·Î 0x8048478 : sub $0x8,%esp 0x804847b : pushl 0xfffffffc(%ebp) 0x804847e : push $0x8048508 0x8048483 : call 0x804833c 0x8048488 : add $0x10,%esp // printf("%d\t",i); i°ªÀ» Ãâ·Â 0x804848b : lea 0xfffffffc(%ebp),%eax 0x804848e : incl (%eax) i++) 0x8048490 : jmp 0x8048470 0x8048492 : mov %esi,%esi back to the for(main+16) 0x8048494 : leave 0x8048495 : ret 0x8048496 : mov %esi,%esi 0x8048508 <_IO_stdin_used+4>: "%d\t" main() { int i; for(i = 1; i < 10; i++) printf("%d\t",i); } ---------------------------------------------------- 0x8048460
: push %ebp 0x8048461 : mov %esp,%ebp 0x8048463 : sub $0x8,%esp 0x8048466 : movl $0x1,0xfffffffc(%ebp) // ù¹ø° º¯¼ö int i; 0x804846d : movl $0xa,0xfffffff8(%ebp) // µÎ¹ø° º¯¼ö int j; 0x8048474 : mov 0xfffffffc(%ebp),%eax // i¸¦ %eax¿¡ ³ÖÀ½ 0x8048477 : cmp 0xfffffff8(%ebp),%eax // j°ª°ú %eax(iÀÇ °ª)À» ºñ±³. 0x804847a : jle 0x8048480 // i °ªÀÌ j°ªº¸´Ù À۰ųª °°À¸¸é for³»ºÎ·Î 0x804847c : jmp 0x804849c 0x804847e : mov %esi,%esi 0x8048480 : sub $0x8,%esp 0x8048483 : lea 0xfffffffc(%ebp),%eax 0x8048486 : push %eax 0x8048487 : push $0x8048508 0x804848c : call 0x804833c 0x8048491 : add $0x10,%esp // printf ÇÔ¼ö È£Ãâ 0x8048494 : lea 0xfffffffc(%ebp),%eax 0x8048497 : incl (%eax) 0x8048499 : jmp 0x8048474 // i°ª Áõ°¡½ÃÅ°°í for¹®ÀÇ Ã³À½À¸·Î 0x804849b : nop 0x804849c : leave 0x804849d : ret 0x804849e : mov %esi,%esi main() { int i,j; i = 1; j = 10; for( ; i <= j ; i++) printf("%d\n",&i); } ---------------------------------------------------- 0x8048460
: push %ebp 0x8048461 : mov %esp,%ebp 0x8048463 : sub $0x8,%esp 0x8048466 : nop 0x8048467 : movl $0xa,0xfffffffc(%ebp) 0x804846e : mov %esi,%esi 0x8048470 : cmpl $0x0,0xfffffffc(%ebp) 0x8048474 : jg 0x8048478 // i°ªÀÌ 0º¸´Ù Å©¸é for¹® ³»ºÎ·Î 0x8048476 : jmp 0x8048494 // i°ªÀÌ 0º¸´Ù À۰ųª °°À¸¸é for¹® ¹ÛÀ¸·Î 0x8048478 : sub $0x8,%esp 0x804847b : pushl 0xfffffffc(%ebp) 0x804847e : push $0x8048508 0x8048483 : call 0x804833c 0x8048488 : add $0x10,%esp 0x804848b : lea 0xfffffffc(%ebp),%eax 0x804848e : decl (%eax) 0x8048490 : jmp 0x8048470 0x8048492 : mov %esi,%esi 0x8048494 : leave 0x8048495 : ret 0x8048496 : mov %esi,%esi main() { int i; for(i = 10; i > 0 ; i--) printf("%d\n",i); } ------------------------------------------------------------- 0x8048460
: push %ebp 0x8048461 : mov %esp,%ebp 0x8048463 : sub $0x8,%esp 0x8048466 : nop 0x8048467 : movl $0xa,0xfffffffc(%ebp) 0x804846e : mov %esi,%esi 0x8048470 : cmpl $0x0,0xfffffffc(%ebp) 0x8048474 : jns 0x8048478 0x8048476 : jmp 0x8048494 0x8048478 : sub $0x8,%esp 0x804847b : pushl 0xfffffffc(%ebp) 0x804847e : push $0x8048508 0x8048483 : call 0x804833c 0x8048488 : add $0x10,%esp 0x804848b : lea 0xfffffffc(%ebp),%eax 0x804848e : decl (%eax) 0x8048490 : jmp 0x8048470 0x8048492 : mov %esi,%esi 0x8048494 : leave 0x8048495 : ret 0x8048496 : mov %esi,%esi main() { int i; for(i = 10; i >= 0 ; i--) printf("%d\n",i); } ==================================================================== ´ÜÀÏfor¹®&ºñ±³¹® Á¤¸® +------------------------------------------------------------------+ | nop | | int i = n; movl $0xn, 0xfffffffc(%ebp) | | mov %esi, %esi | | for(i = n ; i < k ; i++) cmpl $0xk-1,0xfffffffc(%ebp) | | jle 0x0804....(for¹® ¾ÈÀ¸·Î) | | jmp 0x0804....(for¹® ¹ÛÀ¸·Î) | | for¹®¾È¿¡ ÀÖ´Â ³»¿ë | | lea 0xfffffffc(%ebp),%eax | | lncl (%eax) | | jmp 0x0804....(for¹® óÀ½À¸·Î) | | mov %esi, %esi | +------------------------------------------------------------------+ | nop | | int i=1, movl $0x1,0xfffffffc(%ebp) | | j=10; movl $0xa,0xfffffff8(%ebp) | | mov 0xfffffffc(%ebp),%eax | | for(i = 1 ; i <= 10 ; i++) cmpl 0xfffffff8(%ebp),%eax | | jle 0x0804....(for¹® ¾ÈÀ¸·Î) | | jmp 0x0804....(for¹® ¹ÛÀ¸·Î) | | for¹®¾È¿¡ ÀÖ´Â ³»¿ë | | lea 0xfffffffc(%ebp),%eax | | lncl (%eax) | | jmp 0x0804....(for¹® óÀ½À¸·Î) | | mov %esi, %esi | +------------------------------------------------------------------+ | nop | | int i = k; movl $0xk, 0xfffffffc(%ebp) | | mov %esi, %esi | | for(i = k ; i > n ; i--) cmpl $0xn, 0xfffffffc(%ebp) | | jg 0x0804....(for¹® ¾ÈÀ¸·Î) | | jmp 0x0804....(for¹® ¹ÛÀ¸·Î) | | for¹®¾È¿¡ ÀÖ´Â ³»¿ë | | lea 0xfffffffc(%ebp), %eax | | decl (%eax) | | jmp 0x0804....(for¹® óÀ½À¸·Î) | | mov %esi, %esi | +------------------------------------------------------------------+ | nop | | int i = 10; movl $0xa,0xfffffffc(%ebp) | | mov %esi, %esi | | for(i = k ; i >= n ; i--) cmpl $0xn, 0xfffffffc(%ebp) | | jns 0x0804....(for¹® ¾ÈÀ¸·Î) | | jmp 0x0804....(for¹® ¹ÛÀ¸·Î) | | for¹®¾È¿¡ ÀÖ´Â ³»¿ë | | lea 0xfffffffc(%ebp), %eax | | decl (%eax) | | jmp 0x0804....(for¹® óÀ½À¸·Î) | | mov %esi, %esi | +------------------------------------------------------------------+ ===================================================================== ------------------------------------------------------------- 4. while¹® 0x8048460
: push %ebp 0x8048461 : mov %esp,%ebp 0x8048463 : sub $0x8,%esp 0x8048466 : movl $0xa,0xfffffffc(%ebp) 0x804846d : lea 0x0(%esi),%esi // int i = 10; 0x8048470 : cmpl $0x0,0xfffffffc(%ebp) 0x8048474 : jg 0x8048478 0x8048476 : jmp 0x8048494 // i¿Í 0À» ºñ±³, i°ªÀÌ 0º¸´Ù Å©¸é while¹® ¾ÈÀ¸·Î // 0º¸´Ù À۰ųª °°À¸¸é while¹® ¹ÛÀ¸·Î // while(i > 0) 0x8048478 : sub $0x8,%esp 0x804847b : pushl 0xfffffffc(%ebp) 0x804847e : push $0x8048508 0x8048483 : call 0x804833c 0x8048488 : add $0x10,%esp // printf("%d\n",i); 0x804848b : lea 0xfffffffc(%ebp),%eax 0x804848e : decl (%eax) // i--; 0x8048490 : jmp 0x8048470 // } whileÀÇ Ã³À½À¸·Î 0x8048492 : mov %esi,%esi 0x8048494 : leave 0x8048495 : ret 0x8048496 : mov %esi,%esi 0x8048508 <_IO_stdin_used+4>: "%d\n" main() { int i = 10; while(i > 0) { printf("%d\n",i); i--; } } ------------------------------------------------------------- 0x8048460
: push %ebp 0x8048461 : mov %esp,%ebp 0x8048463 : sub $0x8,%esp 0x8048466 : movl $0xa,0xfffffffc(%ebp) 0x804846d : lea 0x0(%esi),%esi // int i = 10; 0x8048470 : cmpl $0x0,0xfffffffc(%ebp) 0x8048474 : jns 0x8048478 0x8048476 : jmp 0x8048494 // i°ª°ú 0À» ºñ±³, i°ªÀÌ Å©°Å³ª °°À¸¸é while¾ÈÀ¸·Î // i < 0 À̸é while¹® ¹ÛÀ¸·Î 0x8048478 : lea 0xfffffffc(%ebp),%eax 0x804847b : decl (%eax) // i --; 0x804847d : sub $0x8,%esp 0x8048480 : pushl 0xfffffffc(%ebp) 0x8048483 : push $0x8048508 0x8048488 : call 0x804833c 0x804848d : add $0x10,%esp // printf("%d\n", i); 0x8048490 : jmp 0x8048470 // while¹®ÀÇ Ã³À½À¸·Î } 0x8048492 : mov %esi,%esi 0x8048494 : leave 0x8048495 : ret 0x8048496 : mov %esi,%esi main() { int i = 10; while(i >= 0) { i--; printf("%d\n",i); } } ------------------------------------------------------------- 0x8048460
: push %ebp 0x8048461 : mov %esp,%ebp 0x8048463 : sub $0x8,%esp 0x8048466 : movl $0xa,0xfffffffc(%ebp) 0x804846d : lea 0x0(%esi),%esi // int i = 10 0x8048470 : cmpl $0x13,0xfffffffc(%ebp) 0x8048474 : jle 0x8048478 0x8048476 : jmp 0x8048494 // i°ªÀ̶û 19¶û ºñ±³ // °°°Å³ª ÀÛÀ¸¸é main+24 i<=19 == i<20 // i >= 20 À̸é while¹®À» ºüÁ®³ª°¨ 0x8048478 : sub $0x8,%esp 0x804847b : pushl 0xfffffffc(%ebp) 0x804847e : push $0x8048508 0x8048483 : call 0x804833c 0x8048488 : add $0x10,%esp // printf("%d\n",i); 0x804848b : lea 0xfffffffc(%ebp),%eax 0x804848e : addl $0x2,(%eax) // i += 2; 0x8048491 : jmp 0x8048470 // while¹®ÀÇ Ã³À½À¸·Î } 0x8048493 : nop 0x8048494 : leave 0x8048495 : ret 0x8048496 : mov %esi,%esi main() { int i = 10; while(i < 20) { printf("%d\n",i); i = i+2; } } ------------------------------------------------------------------- 0x8048460
: push %ebp 0x8048461 : mov %esp,%ebp 0x8048463 : sub $0x8,%esp 0x8048466 : movl $0x1,0xfffffffc(%ebp) 0x804846d : lea 0x0(%esi),%esi // int i = 1; 0x8048470 : cmpl $0xa,0xfffffffc(%ebp) 0x8048474 : jle 0x8048478 0x8048476 : jmp 0x8048490 // i¶û 10À̶û ºñ±³ // i°ªÀÌ 10À̶û °°°Å³ª ÀÛÀ¸¸é while¹® ¾ÈÀ¸·Î // i°ªÀÌ 10º¸´Ù Å©¸é while¹® ¹ÛÀ¸·Î // while( i <= 10) 0x8048478 : sub $0xc,%esp 0x804847b : pushl 0xfffffffc(%ebp) 0x804847e : call 0x8048494 0x8048483 : add $0x10,%esp // print(i); 0x8048486 : lea 0xfffffffc(%ebp),%eax 0x8048489 : incl (%eax) // i ++; 0x804848b : jmp 0x8048470 // while¹®ÀÇ Ã³À½À¸·Î } 0x804848d : lea 0x0(%esi),%esi 0x8048490 : leave 0x8048491 : ret 0x8048492 : mov %esi,%esi (gdb) disass print Dump of assembler code for function print: 0x8048494 : push %ebp 0x8048495 : mov %esp,%ebp 0x8048497 : sub $0x8,%esp // int k; 0x804849a : sub $0x8,%esp 0x804849d : pushl 0x8(%ebp) 0x80484a0 : push $0x8048528 0x80484a5 : call 0x804833c 0x80484aa : add $0x10,%esp // printf("%d\n", k); 0x80484ad : mov 0x8(%ebp),%eax 0x80484b0 : mov %eax,%eax 0x80484b2 : leave 0x80484b3 : ret // return k; 0x8048528 <_IO_stdin_used+4>: "%d\n" int print(int k); main() { int i = 1; while( i <= 10) { print(i); i++; } } int print(int k) { printf("%d\n",k); return k; } ------------------------------------------------------------------- ==================================================================== while¹® Á¤¸® +-------------------------------------------------------------------+ | int i = n; movl $0xn,0xfffffffc(%ebp) i°ªÀ» ´ëÀÔ | | lea 0x0(%esi),%esi | | while( i > k) cmpl $0xk,0xfffffffc(%ebp) i°ª°úkºñ±³ | | jg 0x8048478 Å©¸é whlle¾ÈÀ¸·Î | | jmp 0x8048494 while ¹ÛÀ¸·Î | | while¹®¾È¿¡ ÀÖ´Â ³»¿ë | | jmp 0x8048470 while¹® óÀ½À¸·Î | | mov %esi,%esi | +-------------------------------------------------------------------+ | int i = n; movl $0xn,0xfffffffc(%ebp) i°ªÀ» ´ëÀÔ | | lea 0x0(%esi),%esi | | while( i >= k) cmpl $0xk,0xfffffffc(%ebp) i°ª°úkºñ±³ | | jns 0x8048478 Å©¸é whlle¾ÈÀ¸·Î | | jmp 0x8048494 while ¹ÛÀ¸·Î | | while¹®¾È¿¡ ÀÖ´Â ³»¿ë | | jmp 0x8048470 while¹® óÀ½À¸·Î | | mov %esi,%esi | +-------------------------------------------------------------------+ | int i = n; movl $0xn,0xfffffffc(%ebp) i°ªÀ» ´ëÀÔ | | lea 0x0(%esi),%esi | | while( i < k) cmpl $0xk-1,0xfffffffc(%ebp) i°ª°úk-1ºñ±³ | | jle 0x8048478 whlle¾ÈÀ¸·Î | | jmp 0x8048494 while ¹ÛÀ¸·Î | | while¹®¾È¿¡ ÀÖ´Â ³»¿ë | | jmp 0x8048470 while¹® óÀ½À¸·Î | | nop | +-------------------------------------------------------------------+ | int i = n; movl $0xn,0xfffffffc(%ebp) i°ªÀ» ´ëÀÔ | | lea 0x0(%esi),%esi | | while( i <= k) cmpl $0xk,0xfffffffc(%ebp) i°ª°úkºñ±³ | | jle 0x8048478 whlle¾ÈÀ¸·Î | | jmp 0x8048494 while ¹ÛÀ¸·Î | | while¹®¾È¿¡ ÀÖ´Â ³»¿ë | | jmp 0x8048470 while¹® óÀ½À¸·Î | | lea 0x0(%esi),%esi | +-------------------------------------------------------------------+ ¾î¼À¸í·É¾îµé Âü°í ¸µÅ© http://www.izirobotics.co.kr/source/sa9.htm