Example #1
0
File: main.c Project: jfilleau/sss
int main ( int argc, char* argv[] ) {
  int ret;
  state_t *state;
  int argptr =1;

  if(argc > 0){
      if(strcmp(argv[1], "-d") == 0){
	  debug_eval(1);
	  argptr++;
      } else {
	  debug_eval(0);
      }
    yyin = fopen(argv[argptr], "r");
  } else
    yyin = stdin;

  inityylex();


  ret = yyparse();

  if( (ret == 0) && (numerrors == 0)){
    state = (state_t *)malloc(sizeof(state_t));
    state->tbl = NULL;
    state->mem = NULL;
    eval_stmts(program, state);
    return 0;
  } else {
    return -1;
  }

};
Example #2
0
File: eval.c Project: jfilleau/sss
state_t* eval_stmts(ast_t *p, state_t *state)
{
    ast_list_t *stmts;
    ast_list_t *ip;
    ast_t *t1, *t2;
    ast_t *s;
    value_t v;

    assert(p != NULL);
    assert(p->info.node.tag == SEQ);
    ip = p->info.node.arguments;
    while(ip != NULL)
    {
	s = ip->elem;
        value_t e1;

	switch(s->info.node.tag){
	case ASSIGN:
	    /* the lhs */
	    t1 = s->info.node.arguments->elem;
	    /* the rhs */
	    t2 = s->info.node.arguments->next->elem;
	    v = eval_exp(t2, state->tbl, state->mem);
	    switch(t1->tag){
	    case var_ast:
		state->tbl = update_var(t1->info.string, v, state->tbl);
		break;
	    case node_ast:
		assert(t1->info.node.tag == MEM);
		is_first_eval = 0;
		state->mem = store(eval_exp(t1->info.node.arguments->elem, state->tbl, state->mem).value, v, state->mem);
		eval_exp(t2, state->tbl, state->mem);	
		is_first_eval = 0;		  
		break;
	    default:
		assert(0);
	    }
	  break;
	case PRINT:
	    switch(s->info.node.arguments->elem->tag){
	    case str_ast:
		printf("%s\n", s->info.node.arguments->elem->info.string);
		fprintf(stderr, "Tainted variable: None\n");
		break;
	    default:
                e1 = eval_exp(s->info.node.arguments->elem, 
					state->tbl,
					state->mem);
                if (e1.taint) {
                  fprintf(stderr,"%s", "Tainted variable: ");
                  is_first_taint = 1;
                  arithmetic_check(s->info.node.arguments->elem, state);
                  fprintf(stderr,"\n");
                  printf("%s\n", "<secret>");
                }
                else {
                  fprintf(stderr,"%s\n","Tainted variable: None");
                  printf("%u\n", e1.value);
                }
		break;
	    }

	  break;
	case IF:
        //control-flow taint shall NOT be tracked, so no changes here

	    if(eval_exp(s->info.node.arguments->elem, state->tbl, state->mem).value){
		state = eval_stmts(s->info.node.arguments->next->elem, state);
	    } else {
		state = eval_stmts(s->info.node.arguments->next->next->elem, state);
            } 
	  break;
	case SEQ:
	    state = eval_stmts(s->info.node.arguments->next->elem, state);
	  break;
	case ASSERT:
	    if(eval_exp(s->info.node.arguments->elem, state->tbl,state->mem).value ==0){
		printf("Assert failed!\n");
	    }
	  break;
	default:
	  printf("Unknown statement type\n");
	  assert(0);
	  break;
	}
	is_first_eval = 1;
	ip = ip->next;
    }
    return state;
}
Example #3
0
state_t* eval_stmts(ast_t *p, state_t *state)
{
    ast_list_t *stmts;
    ast_list_t *ip;
    ast_t *t1, *t2;
    ast_t *s;
    value_t v;
    int just_tainted = 0;
    int i;
    assert(p != NULL);
    assert(p->info.node.tag == SEQ);
    ip = p->info.node.arguments;
    while(ip != NULL)
    {
	s = ip->elem;

	switch(s->info.node.tag){
	case ASSIGN:
            printf("\nthis is ASSIGN\n");
	    /* the lhs */
	    t1 = s->info.node.arguments->elem;
	    /* the rhs */
	    t2 = s->info.node.arguments->next->elem;
	    v = eval_exp(t2, state->tbl, state->mem);
	    switch(t1->tag){
	    case var_ast:
                printf("\n var ast horela.");
		state->tbl = update_var(t1->info.string, v, state->tbl);// check is tf == 1=>add tbl->name & reset tf= 0
                printf("\n var ast ke baad tbl name : %s",state->tbl->name); 
                if(tf==1){
                         printf("\nVal od type = %d",type);
                         printf("\nTainted. Adding this up! : %s\n",state->tbl->name);
                         add_var(state->tbl->name);
                         printf("\nAdded Taint! %s \n",state->tbl->name);
                         tf = 0;
                         just_tainted = 1;
                         tvar_index = 0;
                         type = 0;
                }
               


                if(constant_check == 1 && just_tainted == 0){
                printf("\n constant present...\n");
                printf("\nvariable name is ..%s\n",state->tbl->name);
                if(check_tain_var(state->tbl->name)){
                       printf("\n removing taint!\n\n");
                       remove_taint_var(state->tbl->name);
                       printf("\nremoved!\n");
                       constant_check = 0;
                      type = 0;
                }
            
                }
                just_tainted = 0;


		break;
	    case node_ast:
                 
                printf("\nMemo horela. ");
               
		assert(t1->info.node.tag == MEM);
		state->mem = store(eval_exp(t1->info.node.arguments->elem,
					  state->tbl, 
					  state->mem), v, state->mem);//same here. 

               
               

                if(tf == 1){
                            printf("\ntaint detected. Adding address %u up\n",state->mem->addr);
                            add_mem(state->mem->addr);
                            printf("\nMemory tainted! Addr : %u \n",state->mem->addr);
                             
                            tf = 0;
                            tmem_index = 0;
                            type = 0;
                            memo = 0;
                }
                     

                printf("\nafter nost ast..mem val is : %u",state->mem->addr);
                if(cc_mem == 2){
                printf("\n constant present...\n");
                if(check_tain_mem(state->mem->addr)){
                       printf("\n removing taint!\n\n");
                       remove_taint_mem(state->mem->addr);
                       printf("\nremoved!\n");
                       cc_mem = 0;
                }
            
                }

      



		break;
	    default:
		assert(0);
	    }
	  break;
	case PRINT:
            printf("\n this is printttt\n");
	    switch(s->info.node.arguments->elem->tag){
	    case str_ast:
                printf("\nin str-ast");
		printf("str asgn %s\n", s->info.node.arguments->elem->info.string);
                fprintf(stderr,"Tainted variable: None\n");
		break;
	    default:
                printf("\n default.\n");
                printf("\n Memory addrs now : %u \n",state->mem->addr);
                printf("\n var name now :%s\n",state->tbl->name);
                coming_from_print =1;
                
		printf("def %u\n", eval_exp(s->info.node.arguments->elem, 
					state->tbl,
	        				state->mem));  
                if (tf==0)
                 fprintf(stderr,"Tainted variable: None\n");
                    

                 
	         if(tf == 1){
                    
                    printf("\nTaint detected!! with type %d and tvar_index %d\n",type,tvar_index);
                    fprintf(stderr,"Tainted variable: ");
                    /*switch(type){
                    case 1 : printf("\nIts a variable!\n"); 
                             %s\n",tvar_arr[tvar_index]);
                             break;
                    case 2 : printf("\nIts a memory!\n");
                             fprintf(stderr,"Tainted variable: mem[%u]\n",tmem_arr[tmem_index]);
                             break;
                   case 3 : printf("\nIts kinda both.\n");
                             fprintf(stderr,"Tainted variable: %s, mem[%u]\n",tvar_arr[tvar_index],tmem_arr[tmem_index]); 
                             break;  
                    case 4 : printf("\nIts direct!\n");
                             fprintf(stderr," direct");
                             break;      
 
                    }
                    fprintf(stderr,"Tainted variable: ");*/
                                                
                    for (i=0;i<=tvar_index; i++)
                      {  if (tvar_arr[i][1] == 2)
                            {
         		   // printf("\nIts direct!\n");
        		    fprintf(stderr,"direct"); 
                        
                               
                            }

                         else if (tvar_arr[i][1] == 1)
                            {
         		   // printf("\nIts a variable!\n");
        		    fprintf(stderr,"mem[%d]",tvar_arr[i][0]); 
                            }

                          else 
                            {
         		   // printf("\nIts a variable!\n");
        		    fprintf(stderr,"%s",tvar_arr[i]); 
                            }
 
                          if (i>0 && i<tvar_index)
                          fprintf(stderr,", ");
       
                      }
                       fprintf(stderr,"\n");
                     
                 }

                 type = 0;
                 tf = 0;
                 tvar_index = 0;
                 tmem_index = 0;
                 coming_from_print = 0;
		break;
	    }

	  break;
	case IF:
            printf("\nthis is IFFF\n");
	    if(eval_exp(s->info.node.arguments->elem, state->tbl, state->mem)){
		state = eval_stmts(s->info.node.arguments->next->elem, state);
	    } else {
		state = eval_stmts(s->info.node.arguments->next->next->elem, state);
            } 
	  break;
	case SEQ:
            printf("\n this is SEQQQ\n");
	    state = eval_stmts(s->info.node.arguments->next->elem, state);
	  break;
	case ASSERT:
	    if(eval_exp(s->info.node.arguments->elem, state->tbl,state->mem) ==0){
		printf("Assert failed!\n");
	    }
	  break;
	default:
	  printf("Unknown statement type\n");
	  assert(0);
	  break;
	}
	ip = ip->next;
    }
    return state;
}