int main() { struct mine { char* a ; char x[20] ; float z ; } i; union crazy { float a ; char b ; int s ; } a ; char x[50] ; spray_paint( (char *) &i, sizeof(i), 0xd1, "main.i" ) ; spray_paint( (char *) &a, sizeof(a), 0xd2, "main.a" ) ; spray_paint( (char *) &x, sizeof(x), 0xd3, "main.x" ) ; sub1() ; return 0 ; }
void sub2() { int i ; char* a ; char x[20] ; spray_paint( (char *) &i, sizeof(i), 0xf1, "sub2.i" ) ; spray_paint( (char *) &a, sizeof(a), 0xf2, "sub2.a" ) ; spray_paint( (char *) &x, sizeof(x), 0xf3, "sub2.x" ) ; printf ( "Min= %p Max= %p\n", min_ptr, max_ptr ) ; dumper( min_ptr,(int) (max_ptr-min_ptr)/16+1 ) ; // // save/destroy the stack here (don't forget to use an external save area) // z=(char *) malloc(max_ptr-min_ptr+1); for (m=0;m<max_ptr-min_ptr+1;m++) *(z+m)=*(min_ptr+m); for (m=0;m<max_ptr-min_ptr+1;m++) *(min_ptr+m)=00; printf( " destroyed stack\n" ) ; dumper( min_ptr,(int) (max_ptr-min_ptr)/16+1 ) ; // // restore the stack here // for (m=0;m<max_ptr-min_ptr+1;m++) *(min_ptr+m)=*(z+m); printf( " restored stack\n" ) ; dumper( min_ptr,(int) (max_ptr-min_ptr)/16+1 ) ; free(z); }
void sub1() { float i ; short a ; int x[20] ; spray_paint( (char *) &i, sizeof(i), 0xe1, "sub1.i" ) ; spray_paint( (char *) &a, sizeof(a), 0xe2, "sub1.a" ) ; spray_paint( (char *) &x, sizeof(x), 0xe3, "sub1.x" ) ; sub2() ; }
void sub2() { int i ; char* a ; char x[20] ; spray_paint( (char *) &i, sizeof(i), 0xf1, "sub2.i" ) ; spray_paint( (char *) &a, sizeof(a), 0xf2, "sub2.a" ) ; spray_paint( (char *) &x, sizeof(x), 0xf3, "sub2.x" ) ; printf ( "Min= %p Max= %p\n", min_ptr, max_ptr ) ; dumper( min_ptr,(int) (max_ptr-min_ptr)/16+1 ) ; // // save/destroy the stack here (don't forget to use an external save area) // char *temp2=min_ptr; char * temp=min_ptr; ////////save int space=(int)(max_ptr-min_ptr); char j[space]; int count=0; do { j[count]=*temp2; temp2++; count++; }while(temp2<=max_ptr); ///overwrites do { *temp=1; temp++; }while(temp<=max_ptr); printf( " destroyed stack\n" ) ; dumper( min_ptr,(int) (max_ptr-min_ptr)/16+1 ) ; // // restore the stack here // char *temp_min=min_ptr; char *temp_max=max_ptr; count=0; do { *temp_min=j[count]; temp_min++; count++; }while(temp_min<=temp_max); printf( " restored stack\n" ) ; dumper( min_ptr,(int) (max_ptr-min_ptr)/16+1 ) ; }