Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:The design of the exoskeleton. Monograph
.pdf
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();
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
