Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

The design of the exoskeleton. Monograph

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
151
ma->addr,ma->len,q-ma->addr,ma->descr); nappend(pdescr,tmp,MAXPDESC); } if (ma->lasti) { snprintf(tmp,MAXDESCR," last input: %s\n",ma->lasti); nappend(pdescr,tmp,MAXPDESC); } return; } }
if (tmp[0]) return;
// Last resort: try do determine where does it point on stack, if // it does point there.
if (miau==2) { int i; for (i=1;i<=current->fntop;i++) { if (q >= current->frstart[i]) if (q < current->frend[i]) { // Wow, something local.
sprintf(tmp,"+ l/%x (maxsize %d) = stack of fcnt_%d (%d down)\n", q,current->frend[i]-q,current->fnid[i],current->fntop-i);
nappend(pdescr,tmp,MAXPDESC); return;
}
}
}
// Giving up.
return;
}
inline char* get_addrdescr(const unsigned int q) { int miau=1; char tmp[MAXDESCR];
152
static char ret[MAXDESCR]; struct fenris_map* ma=0; struct fenris_mem* me=0;
ret[0]=0;
if (miau) { me=lookup_mem(q); if (me) { if (!tmp[0]) { snprintf(tmp,MAXDESCR,"+ %x = %x:%d <off %d> (%s)\n",q, me->addr,me->len,q-me->addr,me->descr); nappend(ret,tmp,MAXPDESC); } else { sprintf(tmp,":%d\n",me->len); pdescr[strlen(pdescr)-1]=0; nappend(ret,tmp,MAXPDESC); } if (me->lasti) { snprintf(tmp,MAXDESCR," last input: %s\n",me->lasti); nappend(ret,tmp,MAXPDESC); } } if (!me) ma=lookup_map(q); if (ma) { if (!tmp[0]) { snprintf(tmp,MAXDESCR,"+ %x = map %x:%d <off %d> (%s)\n",q, ma->addr,ma->len,q-ma->addr,ma->descr); nappend(ret,tmp,MAXPDESC); } if (ma->lasti) { snprintf(tmp,MAXDESCR," last input: %s\n",ma->lasti); nappend(ret,tmp,MAXPDESC); } } }
// Last resort: try do determine where does it point on stack, if // it does point there.
if ((q >> 24) == STACKSEG) { int i; for (i=1;i<=current->fntop;i++) { if (q >= current->frstart[i]) if (q < current->frend[i]) { sprintf(tmp,"+ l/%x (maxsize %d) = stack of fcnt_%d (%d down)\n",
153
q,current->frend[i]-q,current->fnid[i],current->fntop-i);
nappend(ret,tmp,MAXPDESC); } } }
return ret;
}
/******************************************** * Add description of given addr to the log * ********************************************/
static inline void add_wdescr(unsigned int q,char wri) { int miau=0; char tmp[MAXDESCR]; struct fenris_map* ma=0; struct fenris_mem* me=0; char b2[64];
if (T_nodesc) return;
if ((q >> 24) == CODESEG) miau=1; // global else if ((q >> 24) == STACKSEG) miau=2; // local else if (INLIBC(q)) miau=3; // shared else return;
if (current->idtop) sprintf(b2,"%s",lookup_fnct((*current->fnaddr)[current->idtop-1],0,1)); else strcpy(b2,"main");
be_silent=1; add_mem(q,4,0,b2,0); be_silent=0;
tmp[0]=0;
// First of all, it might be a local function. Look for extact // match.
if (miau==1) { if (lookup_fnct(q,0,0)) {
154
sprintf(tmp,"* %s local object %s
~%x)\n",wri?"WRITE":"READ",lookup_fnct(q,0,0),find_id(q,0)?(*current->fnaddr)[find_id(q,0)-1]:q);
append_wlog(tmp); } }
// Then, it can be a library function. Check for extact match, again.
else if (miau==3) { char* x; current->lentry=q; x=find_name_ex(q,2,1); if (x) { sprintf(tmp,"* %s shared object %s ~%x)\n",wri?"WRITE":"READ",x,appr_addr(q)); append_wlog(tmp); } }
if (tmp[0]) { be_silent=1; if (wri) modify_lasti(q,b2,0,0,0); be_silent=0; return; }
// Hmm, look for unspecific stuff - is this a buffer? Or a map?
if (miau) { me=lookup_mem(q); if (me) { snprintf(tmp,MAXDESCR,"* %s buffer~%x\n",wri?"WRITE":"READ", me->addr); append_wlog(tmp); be_silent=1; if (wri) modify_lasti(q,b2,0,0,0); be_silent=0; return; } if (!me) ma=lookup_map(q); if (ma) { snprintf(tmp,MAXDESCR,"* %s map~%x:%d (%s)\n",wri?"WRITE":"READ", ma->addr,ma->len,ma->descr); append_wlog(tmp); be_silent=1; if (wri) modify_lasti(q,b2,0,0,0); be_silent=0;
155
return; } }
// Last resort: try do determine where does it point on stack, if // it does point there.
if (miau==2) { int i; for (i=1;i<=current->fntop;i++) {
if (q >= current->frstart[i]) if (q < current->frend[i]) { // Wow, something local.
sprintf(tmp,"* %s stack of fcnt_%d (%d down)\n",wri?"WRITE":"READ", current->fnid[i],current->fntop-i);
append_wlog(tmp); be_silent=1; if (wri) modify_lasti(q,b2,0,0,0); be_silent=0; return;
}
}
}
fatal("brain damage",0); return;
}
/*************** * Describe fd * ***************/
static inline void add_fd_pdescr(const int fd) { char tmp[MAXDESCR];
156
if (T_nodesc) return;
if ((fd<0) || (fd>=current->fdtop)) { char buf[100]; sprintf(buf,"/proc/%d/fd/%d",current->pid,fd); if (fd==0 || fd==1 || fd==2 ||!access(buf,F_OK)) { char b[1024]; bzero(b,sizeof(b)); readlink(buf,b,1000); sprintf(tmp,"+ fd %d: \"%s\", origin unknown\n",fd,b); nappend(pdescr,tmp,MAXPDESC); unknown_filedes(fd,b); } return; }
if (!((*current->fd)[fd].name)) { char buf[100]; sprintf(buf,"/proc/%d/fd/%d",current->pid,fd); if (fd==0 || fd==1 || fd==2 || !access(buf,F_OK)) { char b[1024]; bzero(b,sizeof(b)); readlink(buf,b,1000); sprintf(tmp,"+ fd %d: \"%s\", origin unknown\n",fd,b); nappend(pdescr,tmp,MAXPDESC); unknown_filedes(fd,b); } return; }
sprintf(tmp,"+ fd %d: \"%s\", %s\n",fd,(*current->fd)[fd].name, (*current->fd)[fd].descr);
nappend(pdescr,tmp,MAXPDESC);
// What are you looking for here, you poor little lost soul? // But since you're already here, what would you say for a // little trivia? http://lcamtuf.coredump.cx/simple.txt :-)
}
inline char* get_fddescr(const int fd) { char tmp[MAXDESCR]; static char ret[MAXDESCR];
157
ret[0]=0;
if ((fd<0) || (fd>=current->fdtop) || !((*current->fd)[fd].name)) { char buf[100]; sprintf(buf,"/proc/%d/fd/%d",current->pid,fd); if (fd==0 || fd==1 || fd==2 || !access(buf,F_OK)) { char b[1024]; bzero(b,sizeof(b)); readlink(buf,b,1000); sprintf(tmp,"+ fd %d: \"%s\", origin unknown\n",fd,b); nappend(ret,tmp,MAXPDESC); return ret; } return ""; }
sprintf(tmp,"+ fd %d: \"%s\", %s\n",fd,(*current->fd)[fd].name, (*current->fd)[fd].descr);
nappend(ret,tmp,MAXPDESC); return ret;
}
/**************** * Get filename * ****************/
static inline char* get_fname(const int fd) {
if ((fd<0) || (fd>=current->fdtop)) return "<unknown>";
if (!(*current->fd)[fd].name) return "<unknown>";
return (*current->fd)[fd].name;
}
/**************** * Write pdescr * ****************/
static inline void dump_pdescr(const int ind) {
158
char *x=pdescr, *old;
if (!pdescr[0]) return; if (T_nodesc) return;
while ((x=strchr(old=x,'\n'))) { indent(ind); *x=0; debug("%s\n",old); x++; }
RD();
}
/************** * Write wlog * **************/
static inline void dump_memchg(const int ind) { char *x=current->wlog[current->fntop], *old,*y;
if (!x) return; if (T_nodesc) return;
indent(ind); debug("// function has accessed non-local memory:\n"); RD();
while ((x=strchr(old=x,'\n'))) { indent(ind); *x=0; if ((y=strchr(old,'~'))) { unsigned int addr; if (*(y-1)==' ') *y='('; else *y=' '; if (sscanf(y+1,"%x",&addr)==1) Xv(addr); } debug("%s\n",old); dump_pdescr(ind); x++; }
free(current->wlog[current->fntop]); current->wlog[current->fntop]=0;
159
}
/********************************* * Read stack and display params * *********************************/
static inline void display_fparams(unsigned int esP,int pcnt,const char* where) { int i; unsigned int q; RD(); for (i=0;i<pcnt;i++) { q=ptrace(PTRACE_PEEKDATA,pid,esP+4*i,0); display_value(q,where); if (i!=pcnt-1) debug(", "); } }
static inline void warn_opt(int d, int p) { if (d!=p) { current->bopt++; if (!current->Owarn) { current->Owarn=1; debug("" "**********************************************************\n" "* This function is supposed to have different number of *\n" "* parameters than I've detected. Because this particular *\n" "* library call is known to me, it will be displayed *\n" "* properly - however, parameter number auto-detection *\n" "* for unknown library calls and local functions might be *\n" "* inaccurate. This is very likely to be a result of high *\n" "* optimization of traced binary. Try documentation. *\n" "**********************************************************\n"); } } else current->gopt++; }
/***************************************** * Try to find a match for this function * *****************************************/
160
static inline void display_specific(void) {
char n[MAXDESCR]; char* f=current->lcname; char buf[MAXDESCR]; char b2[MAXDESCR];
if (current->idtop) sprintf(n,"L %s:%s",lookup_fnct((*current->fnaddr)[current->idtop-1],0,1),f); else sprintf(n,"L main:%s",f);
debug("L %s (",f);
RD();
if (!strcmp(f,"strlen")) { get_string_from_child(current->lcpar[0],buf,sizeof(buf)); debug("%x \"%s\")",Xv(current->lcpar[0]),buf); debug(" = %d\n",(int)r.eax); DD(); warn_opt(1,current->lcpcnt); add_mem(current->lcpar[0],r.eax+1,0,n,0); }
else if (!strcmp(f,"malloc")) { debug("%d)",current->lcpar[0]); debug(" = %x\n",(int)r.eax); DD(); warn_opt(1,current->lcpcnt); if (r.eax) add_mem(r.eax,current->lcpar[0],0,n,1); }
else if (!strcmp(f,"strdup")) { get_string_from_child(current->lcpar[0],buf,sizeof(buf)); debug("%x \"%s\")",Xv(current->lcpar[0]),buf); debug(" = %x\n",(int)r.eax); DD(); warn_opt(1,current->lcpcnt); if (r.eax) add_mem(r.eax,strlen(buf),0,n,1); }
else if (!strcmp(f,"calloc")) { debug("%d, %d)",current->lcpar[0],current->lcpar[1]); debug(" = %x\n",(int)r.eax); DD();