void __libc_longjmp(sigjmp_buf env,int val) { if (env[0].__mask_was_saved) { sigprocmask(SIG_SETMASK,(sigset_t*)&env[0].__saved_mask,0); } if (val==0) val=1; __longjmp(env[0].__jmpbuf,val); }
// // longjmp // _Noreturn void (longjmp)(jmp_buf env, int val) { if(!val) val = 1; __longjmp(env, val); }
void ____longjmp_chk (__jmp_buf env, int val) { void *this_frame = __builtin_frame_address (0); void *saved_frame = JB_FRAME_ADDRESS (env); INTERNAL_SYSCALL_DECL (err); stack_t ss; /* If "env" is from a frame that called us, we're all set. */ if (called_from(this_frame, saved_frame)) __longjmp (env, val); /* If we can't get the current stack state, give up and do the longjmp. */ if (INTERNAL_SYSCALL (sigaltstack, err, 2, NULL, &ss) != 0) __longjmp (env, val); /* If we we are executing on the alternate stack and within the bounds, do the longjmp. */ if (ss.ss_flags == SS_ONSTACK && (this_frame >= ss.ss_sp && this_frame < (ss.ss_sp + ss.ss_size))) __longjmp (env, val); __fortify_fail ("longjmp causes uninitialized stack frame"); }
int main(int argc, char* argv[]) { HMODULE h = NULL; FILE* fp = NULL; jmp_buf env; int i; char* buf; ucontext_t context; h = LoadLibrary("windll.dll"); if (h != NULL) { pFunc = (void*)GetProcAddress(h, "windll"); if (pFunc != NULL) { printf("winmain: Call windll\n"); pFunc(); } } if (argc >= 3) { memcpy(env, argv[argc-2], sizeof(jmp_buf)); sscanf(argv[argc-1], "%p", &__longjmp); fp = fopen("__funp.txt", "w"); if (fp != NULL) fprintf(fp, "%p\n", pFunc); fclose(fp); fp = fopen("__env.bin", "rb"); if (fp != NULL) fread(&context, sizeof(char), sizeof(ucontext_t), fp); fclose(fp); setcontext(&context); __longjmp(env, 2); printf("Never Executed!\n"); } }
PJ_DEF(void) pj_longjmp(pj_jmp_buf env, int val) { __longjmp(env, val); }
void RTSuicide( void ) { if( __SpawnStack == NULL ) exit( -1 ); __longjmp( *__SpawnStack, 1 ); }