2
0
Эх сурвалжийг харах

Heuristic Stack Overflow detection and trap for Linux. Based on work of A.Shiryaev

adimetrius 5 жил өмнө
parent
commit
c3aeeca7a3

BIN
BlackBox/Var/Mod/StackHangup.odc


+ 263 - 255
BlackBox/_FreeBSDLinuxOpenBSD_/Lin/Mod/gen-Libc/Libc.txt.templ

@@ -1,255 +1,263 @@
-MODULE LinLibc ["libc.so%%libver%%"];
-
-	(*
-		%%osname%%
-		%%machine%%
-	*)
-
-	CONST
-		NULL* = 0H;
-		FALSE* = 0;
-		TRUE* = 1;
-
-		CLOCKS_PER_SEC* = %%clockspersec%%;
-
-		MAP_FAILED* = -1;
-
-		(* MAP_PRIVATE, MAP_ANON (intFlags) *)
-%%defs-map%%
-
-		(* PROT_READ, PROT_WRITE, PROT_EXEC (intFlags) *)
-%%defs-prot%%
-
-		(* SIG_UNBLOCK, SIG_SETMASK (int) *)
-%%defs-sigmask%%
-
-		(* FPE_INTDIV, FPE_INTOVF, FPE_FLTDIV, FPE_FLTOVF, FPE_FLTUND, FPE_FLTRES, FPE_FLTINV, FPE_FLTSUB (int) *)
-%%defs-fpe%%
-
-		(* SA_SIGINFO (intFlags) *)
-%%defs-sa%%
-
-		(* SIGINT, SIGILL, SIGFPE, SIGSEGV, SIGKILL, SIGSTOP, SIGWINCH, SIGTHR (int) *)
-%%defs-signo%%
-		_NSIG* = %%nsig%%;
-
-		(* SIG_DFL, SIG_IGN, SIG_ERR *)
-%%defs-sig%%
-
-(*
-		PAGE_SIZE* = 4096;
-*)
-%%defs-sc%%
-
-		SIGSTKSZ* = %%sigstksz%%;
-
-		(* ENOENT, EEXIST, EACCES, ENOMEM, EDQUOT, EMFILE, ENOTDIR (int) *)
-%%defs-errno%%
-
-%%defs-wait%%
-
-		NAME_MAX* = %%namemax%%;
-
-		SEEK_SET* = 0;
-		SEEK_CUR* = 1;
-		SEEK_END* = 2;
-
-		STDIN_FILENO* = 0;
-		STDOUT_FILENO* = 1;
-		STDERR_FILENO* = 2;
-
-		P_tmpdir* = "/tmp";
-
-		(* O_RDWR, O_NONBLOCK (intFlags) *)
-%%defs-fcntlo%%
-
-%%defs-clockid%%
-
-	TYPE
-		StrArray* = POINTER TO ARRAY [untagged] OF PtrSTR;
-		PtrSTR* = POINTER TO ARRAY [untagged] OF SHORTCHAR;
-
-		(* PtrVoid, int, long, size_t, ssize_t, off_t, time_t, clock_t, sigjmp_buf *)
-		(* mode_t, intFlags, sigset_t (set) *)
-%%defs-basictypes%%
-
-		tm* = POINTER TO tmDesc;
-		tmDesc* = RECORD [untagged]
-			(* NOTE: check record size *)
-			(* tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday [ , tm_gmtoff ] *)
-%%fields-tm%%
-		END;
-
-		Ptrsiginfo_t* = POINTER TO siginfo_t;
-		siginfo_t = RECORD [untagged]
-			(* si_code, fault address *)
-%%fields-siginfo%%
-		END;
-
-		Ptrucontext_t* = POINTER TO ucontext_t;
-		ucontext_t = RECORD [untagged]
-			(* IP, SP, FP *)
-%%fields-ucontext%%
-		END;
-
-		sa_sigaction_t* = PROCEDURE [ccall] (sig: int; siginfo: Ptrsiginfo_t; context: Ptrucontext_t);
-		sigaction_t* = RECORD [untagged]
-(*
-			sa_sigaction*: sa_sigaction_t,
-			sa_flags*: intFlags, sa_mask*: sigset_t
-*)
-%%fields-sigaction%%
-		END;
-
-		stack_t* = RECORD [untagged]
-(*
-			ss_sp*: PtrVoid, ss_size*: size_t, ss_flags*: intFlags
-*)
-%%fields-stack%%
-		END;
-
-		stat_t* = RECORD [untagged]
-(*
-			NOTE: check record size
-			st_mode*: mode_t, st_size*: off_t, st_mtime*: time_t
-*)
-%%fields-stat%%
-		END;
-
-		PtrFILE* = PtrVoid;
-		PtrDIR* = PtrVoid;
-
-		PtrDirent* = POINTER TO Dirent;
-		Dirent = RECORD [untagged]
-(*
-			d_name*: ARRAY [untagged] NAME_MAX + 1 OF SHORTCHAR
-*)
-%%fields-dirent%%
-		END;
-
-		timespec_t* = RECORD [untagged]
-%%fields-timespec%%
-		END;
-
-(*
-	VAR
-		stdin*: INTEGER;
-		timezone*: INTEGER; (* or tm.tm_gmtoff *)
-*)
-(*
-	PROCEDURE [ccall] __errno_location* (): PtrVoid;
-*)
-(*
-	(* POSIX.1 *)
-		PROCEDURE [ccall] stat* (path: PtrSTR; VAR sp: stat_t): int;
-*)
-%%custom%%
-
-	(* ANSI C 89 *)
-		PROCEDURE [ccall] clock* (): clock_t;
-
-	(* POSIX.1 *)
-		PROCEDURE [ccall] clock_gettime* (clock_id: clockid_t; VAR tp: timespec_t): int;
-
-	PROCEDURE [ccall] mmap* (adr: PtrVoid; len: size_t; prot: intFlags; flags: intFlags; fd: int; offset: off_t): PtrVoid;
-	(* BSD *)
-		PROCEDURE [ccall] munmap* (adr: PtrVoid; len: size_t): int;
-		PROCEDURE [ccall] mprotect* (adr: PtrVoid; len: size_t; prot: intFlags): int;
-
-(*
-	PROCEDURE [ccall] calloc* (nmemb: size_t; size: size_t): PtrVoid;
-	(* ANSI C 89 *)
-		PROCEDURE [ccall] malloc* (size: size_t): PtrVoid;
-*)
-		PROCEDURE [ccall] free* (ptr: PtrVoid);
-
-	(* AT&T *)
-		PROCEDURE [ccall] time* (VAR [nil] t: time_t): time_t;
-	PROCEDURE [ccall] gmtime* (VAR [nil] t: time_t): tm;
-	PROCEDURE [ccall] localtime* (VAR [nil] t: time_t): tm;
-
-	(* POSIX.1 *)
-(*
-		PROCEDURE [ccall] sigsetjmp* (VAR env: sigjmp_buf; savemask: int): int;
-*)
-		PROCEDURE [ccall] siglongjmp* (VAR env: sigjmp_buf; val: int);
-
-	(* POSIX.1 *)
-		PROCEDURE [ccall] sigemptyset* (set: PtrSigset_t): int;
-		PROCEDURE [ccall] sigfillset* (set: PtrSigset_t): int;
-		PROCEDURE [ccall] sigaddset* (set: PtrSigset_t; signo: int): int;
-		PROCEDURE [ccall] sigprocmask* (how: int; set: PtrSigset_t; oset: PtrSigset_t): int;
-
-	(* POSIX.1 *)
-		PROCEDURE [ccall] sigaction* (sig: int; VAR [nil] act: sigaction_t; VAR [nil] oact: sigaction_t): int;
-
-	(* BSD *)
-		PROCEDURE [ccall] sigaltstack* (VAR [nil] ss: stack_t; VAR [nil] oss: stack_t): int;
-
-	(* ANSI C 89 *)
-		PROCEDURE [ccall] getenv* (s: PtrSTR): PtrSTR;
-
-	(* ANSI C 89 *)
-		PROCEDURE [ccall] fopen* (path, mode: PtrSTR): PtrFILE;
-		PROCEDURE [ccall] fdopen* (fildes: int; mode: PtrSTR): PtrFILE;
-		PROCEDURE [ccall] fclose* (stream: PtrFILE): int;
-		PROCEDURE [ccall] fread* (ptr: PtrVoid; size: size_t; nmemb: size_t; stream: PtrFILE): size_t;
-		PROCEDURE [ccall] fwrite* (ptr: PtrVoid; size: size_t; nmemb: size_t; stream: PtrFILE): size_t;
-		PROCEDURE [ccall] fflush* (s: PtrFILE): int;
-		PROCEDURE [ccall] printf* (s: PtrSTR): int;
-	(* ANSI C 89, XPG4 *)
-		PROCEDURE [ccall] fseek* (stream: PtrFILE; offset: long; whence: int): int;
-
-	(* POSIX.1 *)
-		PROCEDURE [ccall] fileno* (stream: PtrFILE): int;
-
-	(* POSIX.1 *)
-		PROCEDURE [ccall] rename* (from, to: PtrSTR): int;
-		PROCEDURE [ccall] mkdir* (path: PtrSTR; mode: mode_t): int;
-		PROCEDURE [ccall] opendir* (filename: PtrSTR): PtrDIR;
-		PROCEDURE [ccall] readdir* (dirp: PtrDIR): PtrDirent;
-		PROCEDURE [ccall] closedir* (dirp: PtrDIR): int;
-	(* ANSI C 89, XPG4.2 *)
-		PROCEDURE [ccall] remove* (path: PtrSTR): int;
-		PROCEDURE [ccall] canonicalize_file_name* (path: PtrSTR): PtrSTR;
-
-	(* POSIX.1 *)
-		PROCEDURE [ccall] getcwd* (buf: PtrSTR; size: size_t): PtrSTR;
-
-	(* ANSI C 99 *)
-		PROCEDURE [ccall] exit* (status: int);
-
-	(* ANSI C 89 *)
-		PROCEDURE [ccall] strftime* (buf: PtrSTR; maxsize: size_t; format: PtrSTR; timeptr: tm): size_t;
-
-	(* XXX: use fread instead *)
-		PROCEDURE [ccall] fgets* (str: PtrSTR; size: int; stream: PtrFILE): PtrSTR;
-
-	(* POSIX.1 *)
-		PROCEDURE [ccall] open* (path: PtrSTR; flags: intFlags; mode: mode_t): int;
-		PROCEDURE [ccall] write* (d: int; buf: PtrVoid; nbytes: size_t): ssize_t;
-		PROCEDURE [ccall] read* (d: int; buf: PtrVoid; nbytes: size_t): ssize_t;
-		PROCEDURE [ccall] close* (d: int): int;
-
-	(* POSIX.1 *)
-		PROCEDURE [ccall] chmod* (path: PtrSTR; mode: mode_t): int;
-		PROCEDURE [ccall] fchmod* (fd: int; mode: mode_t): int;
-
-	(* POSIX.1 *)
-		PROCEDURE [ccall] fork* (): pid_t;
-		PROCEDURE [ccall] waitpid* (wpid: pid_t; VAR [nil] status: int; options: intFlags): pid_t;
-
-	(* POSIX.1 *)
-		PROCEDURE [ccall] execv* (path: PtrSTR; argv: POINTER [untagged] TO ARRAY [untagged] OF PtrSTR): int;
-		PROCEDURE [ccall] execvp* (file: PtrSTR; argv: POINTER [untagged] TO ARRAY [untagged] OF PtrSTR): int;
-
-	(* POSIX.2 *)
-		PROCEDURE [ccall] system* (string: PtrSTR): int;
-
-	(* POSIX.1 *)
-		PROCEDURE [ccall] sysconf* (name: int): long;
-
-	PROCEDURE [ccall] popen* (command, type: PtrSTR): PtrFILE;
-	PROCEDURE [ccall] pclose* (stream: PtrFILE): int;
-
-END LinLibc.
+MODULE LinLibc ["libc.so%%libver%%"];
+
+	(*
+		%%osname%%
+		%%machine%%
+	*)
+
+	CONST
+		NULL* = 0H;
+		FALSE* = 0;
+		TRUE* = 1;
+
+		CLOCKS_PER_SEC* = %%clockspersec%%;
+
+		MAP_FAILED* = -1;
+
+		(* MAP_PRIVATE, MAP_ANON (intFlags) *)
+%%defs-map%%
+
+		(* PROT_READ, PROT_WRITE, PROT_EXEC (intFlags) *)
+%%defs-prot%%
+
+		(* SIG_UNBLOCK, SIG_SETMASK (int) *)
+%%defs-sigmask%%
+
+		(* FPE_INTDIV, FPE_INTOVF, FPE_FLTDIV, FPE_FLTOVF, FPE_FLTUND, FPE_FLTRES, FPE_FLTINV, FPE_FLTSUB (int) *)
+%%defs-fpe%%
+
+		(* SA_SIGINFO (intFlags) *)
+%%defs-sa%%
+
+		(* SIGINT, SIGILL, SIGFPE, SIGSEGV, SIGKILL, SIGSTOP, SIGWINCH, SIGTHR (int) *)
+%%defs-signo%%
+		_NSIG* = %%nsig%%;
+
+		(* SIG_DFL, SIG_IGN, SIG_ERR *)
+%%defs-sig%%
+
+(*
+		PAGE_SIZE* = 4096;
+*)
+%%defs-sc%%
+
+		SIGSTKSZ* = %%sigstksz%%;
+
+		(* ENOENT, EEXIST, EACCES, ENOMEM, EDQUOT, EMFILE, ENOTDIR (int) *)
+%%defs-errno%%
+
+%%defs-wait%%
+
+		NAME_MAX* = %%namemax%%;
+
+		SEEK_SET* = 0;
+		SEEK_CUR* = 1;
+		SEEK_END* = 2;
+
+		STDIN_FILENO* = 0;
+		STDOUT_FILENO* = 1;
+		STDERR_FILENO* = 2;
+
+		P_tmpdir* = "/tmp";
+		
+		RLIMIT_STACK* = 3;
+
+		(* O_RDWR, O_NONBLOCK (intFlags) *)
+%%defs-fcntlo%%
+
+%%defs-clockid%%
+
+	TYPE
+		StrArray* = POINTER TO ARRAY [untagged] OF PtrSTR;
+		PtrSTR* = POINTER TO ARRAY [untagged] OF SHORTCHAR;
+
+		(* PtrVoid, int, long, size_t, ssize_t, off_t, time_t, clock_t, sigjmp_buf *)
+		(* mode_t, intFlags, sigset_t (set) *)
+%%defs-basictypes%%
+
+		tm* = POINTER TO tmDesc;
+		tmDesc* = RECORD [untagged]
+			(* NOTE: check record size *)
+			(* tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday [ , tm_gmtoff ] *)
+%%fields-tm%%
+		END;
+
+		Ptrsiginfo_t* = POINTER TO siginfo_t;
+		siginfo_t = RECORD [untagged]
+			(* si_code, fault address *)
+%%fields-siginfo%%
+		END;
+
+		Ptrucontext_t* = POINTER TO ucontext_t;
+		ucontext_t = RECORD [untagged]
+			(* IP, SP, FP *)
+%%fields-ucontext%%
+		END;
+
+		sa_sigaction_t* = PROCEDURE [ccall] (sig: int; siginfo: Ptrsiginfo_t; context: Ptrucontext_t);
+		sigaction_t* = RECORD [untagged]
+(*
+			sa_sigaction*: sa_sigaction_t,
+			sa_flags*: intFlags, sa_mask*: sigset_t
+*)
+%%fields-sigaction%%
+		END;
+
+		stack_t* = RECORD [untagged]
+(*
+			ss_sp*: PtrVoid, ss_size*: size_t, ss_flags*: intFlags
+*)
+%%fields-stack%%
+		END;
+
+		stat_t* = RECORD [untagged]
+(*
+			NOTE: check record size
+			st_mode*: mode_t, st_size*: off_t, st_mtime*: time_t
+*)
+%%fields-stat%%
+		END;
+
+		PtrFILE* = PtrVoid;
+		PtrDIR* = PtrVoid;
+
+		PtrDirent* = POINTER TO Dirent;
+		Dirent = RECORD [untagged]
+(*
+			d_name*: ARRAY [untagged] NAME_MAX + 1 OF SHORTCHAR
+*)
+%%fields-dirent%%
+		END;
+
+		timespec_t* = RECORD [untagged]
+%%fields-timespec%%
+		END;
+		
+		rlimit* = RECORD [untagged]
+			rlim_cur*, rlim_max*: INTEGER;	(* rlim_t *)
+		END;
+
+(*
+	VAR
+		stdin*: INTEGER;
+		timezone*: INTEGER; (* or tm.tm_gmtoff *)
+*)
+(*
+	PROCEDURE [ccall] __errno_location* (): PtrVoid;
+*)
+(*
+	(* POSIX.1 *)
+		PROCEDURE [ccall] stat* (path: PtrSTR; VAR sp: stat_t): int;
+*)
+%%custom%%
+
+	(* ANSI C 89 *)
+		PROCEDURE [ccall] clock* (): clock_t;
+
+	(* POSIX.1 *)
+		PROCEDURE [ccall] clock_gettime* (clock_id: clockid_t; VAR tp: timespec_t): int;
+
+	PROCEDURE [ccall] mmap* (adr: PtrVoid; len: size_t; prot: intFlags; flags: intFlags; fd: int; offset: off_t): PtrVoid;
+	(* BSD *)
+		PROCEDURE [ccall] munmap* (adr: PtrVoid; len: size_t): int;
+		PROCEDURE [ccall] mprotect* (adr: PtrVoid; len: size_t; prot: intFlags): int;
+
+
+	PROCEDURE [ccall] calloc* (nmemb: size_t; size: size_t): PtrVoid;
+(*	(* ANSI C 89 *)
+		PROCEDURE [ccall] malloc* (size: size_t): PtrVoid;
+*)
+		PROCEDURE [ccall] free* (ptr: PtrVoid);
+
+	(* AT&T *)
+		PROCEDURE [ccall] time* (VAR [nil] t: time_t): time_t;
+	PROCEDURE [ccall] gmtime* (VAR [nil] t: time_t): tm;
+	PROCEDURE [ccall] localtime* (VAR [nil] t: time_t): tm;
+
+	(* POSIX.1 *)
+(*
+		PROCEDURE [ccall] sigsetjmp* (VAR env: sigjmp_buf; savemask: int): int;
+*)
+		PROCEDURE [ccall] siglongjmp* (VAR env: sigjmp_buf; val: int);
+
+	(* POSIX.1 *)
+		PROCEDURE [ccall] sigemptyset* (set: PtrSigset_t): int;
+		PROCEDURE [ccall] sigfillset* (set: PtrSigset_t): int;
+		PROCEDURE [ccall] sigaddset* (set: PtrSigset_t; signo: int): int;
+		PROCEDURE [ccall] sigprocmask* (how: int; set: PtrSigset_t; oset: PtrSigset_t): int;
+
+	(* POSIX.1 *)
+		PROCEDURE [ccall] sigaction* (sig: int; VAR [nil] act: sigaction_t; VAR [nil] oact: sigaction_t): int;
+
+	(* BSD *)
+		PROCEDURE [ccall] sigaltstack* (VAR [nil] ss: stack_t; VAR [nil] oss: stack_t): int;
+
+	(* ANSI C 89 *)
+		PROCEDURE [ccall] getenv* (s: PtrSTR): PtrSTR;
+
+	(* ANSI C 89 *)
+		PROCEDURE [ccall] fopen* (path, mode: PtrSTR): PtrFILE;
+		PROCEDURE [ccall] fdopen* (fildes: int; mode: PtrSTR): PtrFILE;
+		PROCEDURE [ccall] fclose* (stream: PtrFILE): int;
+		PROCEDURE [ccall] fread* (ptr: PtrVoid; size: size_t; nmemb: size_t; stream: PtrFILE): size_t;
+		PROCEDURE [ccall] fwrite* (ptr: PtrVoid; size: size_t; nmemb: size_t; stream: PtrFILE): size_t;
+		PROCEDURE [ccall] fflush* (s: PtrFILE): int;
+		PROCEDURE [ccall] printf* (s: PtrSTR): int;
+	(* ANSI C 89, XPG4 *)
+		PROCEDURE [ccall] fseek* (stream: PtrFILE; offset: long; whence: int): int;
+
+	(* POSIX.1 *)
+		PROCEDURE [ccall] fileno* (stream: PtrFILE): int;
+
+	(* POSIX.1 *)
+		PROCEDURE [ccall] rename* (from, to: PtrSTR): int;
+		PROCEDURE [ccall] mkdir* (path: PtrSTR; mode: mode_t): int;
+		PROCEDURE [ccall] opendir* (filename: PtrSTR): PtrDIR;
+		PROCEDURE [ccall] readdir* (dirp: PtrDIR): PtrDirent;
+		PROCEDURE [ccall] closedir* (dirp: PtrDIR): int;
+	(* ANSI C 89, XPG4.2 *)
+		PROCEDURE [ccall] remove* (path: PtrSTR): int;
+		PROCEDURE [ccall] canonicalize_file_name* (path: PtrSTR): PtrSTR;
+
+	(* POSIX.1 *)
+		PROCEDURE [ccall] getcwd* (buf: PtrSTR; size: size_t): PtrSTR;
+
+	(* ANSI C 99 *)
+		PROCEDURE [ccall] exit* (status: int);
+
+	(* ANSI C 89 *)
+		PROCEDURE [ccall] strftime* (buf: PtrSTR; maxsize: size_t; format: PtrSTR; timeptr: tm): size_t;
+
+	(* XXX: use fread instead *)
+		PROCEDURE [ccall] fgets* (str: PtrSTR; size: int; stream: PtrFILE): PtrSTR;
+
+	(* POSIX.1 *)
+		PROCEDURE [ccall] open* (path: PtrSTR; flags: intFlags; mode: mode_t): int;
+		PROCEDURE [ccall] write* (d: int; buf: PtrVoid; nbytes: size_t): ssize_t;
+		PROCEDURE [ccall] read* (d: int; buf: PtrVoid; nbytes: size_t): ssize_t;
+		PROCEDURE [ccall] close* (d: int): int;
+
+	(* POSIX.1 *)
+		PROCEDURE [ccall] chmod* (path: PtrSTR; mode: mode_t): int;
+		PROCEDURE [ccall] fchmod* (fd: int; mode: mode_t): int;
+
+	(* POSIX.1 *)
+		PROCEDURE [ccall] fork* (): pid_t;
+		PROCEDURE [ccall] waitpid* (wpid: pid_t; VAR [nil] status: int; options: intFlags): pid_t;
+
+	(* POSIX.1 *)
+		PROCEDURE [ccall] execv* (path: PtrSTR; argv: POINTER [untagged] TO ARRAY [untagged] OF PtrSTR): int;
+		PROCEDURE [ccall] execvp* (file: PtrSTR; argv: POINTER [untagged] TO ARRAY [untagged] OF PtrSTR): int;
+
+	(* POSIX.2 *)
+		PROCEDURE [ccall] system* (string: PtrSTR): int;
+
+	(* POSIX.1 *)
+		PROCEDURE [ccall] sysconf* (name: int): long;
+
+	PROCEDURE [ccall] popen* (command, type: PtrSTR): PtrFILE;
+	PROCEDURE [ccall] pclose* (stream: PtrFILE): int;
+
+	PROCEDURE [ccall] getrlimit* (resource: INTEGER; VAR rlim: rlimit);
+
+END LinLibc.

BIN
BlackBox/_Linux_/Lin/Mod/Libc.odc


BIN
BlackBox/_Linux_/System/Mod/Kernel.odc