From 78ffefc540a2c39840f46a92acb1f1f8cb747edb Mon Sep 17 00:00:00 2001 From: Joey Jiao Date: Mon, 1 Jul 2024 09:58:31 +0800 Subject: all: get pcBase from elf first which can be used for kaslr offset calc --- pkg/cover/backend/backend.go | 8 ++++++++ pkg/cover/backend/elf.go | 21 +++++++++++++++++++++ pkg/cover/report.go | 4 ++++ pkg/rpcserver/rpcserver.go | 6 ++++++ 4 files changed, 39 insertions(+) (limited to 'pkg') diff --git a/pkg/cover/backend/backend.go b/pkg/cover/backend/backend.go index bba483fa8..49f2f9508 100644 --- a/pkg/cover/backend/backend.go +++ b/pkg/cover/backend/backend.go @@ -6,6 +6,7 @@ package backend import ( "fmt" + "github.com/google/syzkaller/pkg/mgrconfig" "github.com/google/syzkaller/sys/targets" ) @@ -79,3 +80,10 @@ func Make(target *targets.Target, vm, objDir, srcDir, buildDir string, splitBuil } return makeELF(target, objDir, srcDir, buildDir, delimiters, moduleObj, modules) } + +func GetPCBase(cfg *mgrconfig.Config) (uint64, error) { + if cfg.Target.OS == targets.Linux { + return getPCBase(cfg) + } + return 0, nil +} diff --git a/pkg/cover/backend/elf.go b/pkg/cover/backend/elf.go index f4f288314..25536c170 100644 --- a/pkg/cover/backend/elf.go +++ b/pkg/cover/backend/elf.go @@ -8,9 +8,11 @@ import ( "encoding/binary" "fmt" "io" + "path/filepath" "strings" "github.com/google/syzkaller/pkg/log" + "github.com/google/syzkaller/pkg/mgrconfig" "github.com/google/syzkaller/sys/targets" ) @@ -217,3 +219,22 @@ func elfGetCompilerVersion(path string) string { } return string(data[:]) } + +func getPCBase(cfg *mgrconfig.Config) (uint64, error) { + bin := filepath.Join(cfg.KernelObj, cfg.SysTarget.KernelObject) + file, err := elf.Open(bin) + if err != nil { + return 0, err + } + defer file.Close() + allSymbols, err := file.Symbols() + if err != nil { + return 0, err + } + for _, sym := range allSymbols { + if sym.Name == "_stext" { + return sym.Value, nil + } + } + return 0, fmt.Errorf("no _stext symbol") +} diff --git a/pkg/cover/report.go b/pkg/cover/report.go index 4a557c252..b41a96356 100644 --- a/pkg/cover/report.go +++ b/pkg/cover/report.go @@ -30,6 +30,10 @@ type Prog struct { type KernelModule = backend.KernelModule +func GetPCBase(cfg *mgrconfig.Config) (uint64, error) { + return backend.GetPCBase(cfg) +} + func MakeReportGenerator(cfg *mgrconfig.Config, subsystem []mgrconfig.Subsystem, modules []*KernelModule, rawCover bool) (*ReportGenerator, error) { impl, err := backend.Make(cfg.SysTarget, cfg.Type, cfg.KernelObj, diff --git a/pkg/rpcserver/rpcserver.go b/pkg/rpcserver/rpcserver.go index 40ca9a316..0cb1e05a9 100644 --- a/pkg/rpcserver/rpcserver.go +++ b/pkg/rpcserver/rpcserver.go @@ -41,6 +41,7 @@ type Config struct { PrintMachineCheck bool Procs int Slowdown int + PCBase uint64 } type Manager interface { @@ -81,6 +82,10 @@ type Server struct { } func New(cfg *mgrconfig.Config, mgr Manager, debug bool) (*Server, error) { + pcBase, err := cover.GetPCBase(cfg) + if err != nil { + return nil, err + } sandbox, err := flatrpc.SandboxToFlags(cfg.Sandbox) if err != nil { return nil, err @@ -109,6 +114,7 @@ func New(cfg *mgrconfig.Config, mgr Manager, debug bool) (*Server, error) { PrintMachineCheck: true, Procs: cfg.Procs, Slowdown: cfg.Timeouts.Slowdown, + PCBase: pcBase, }, mgr) } -- cgit mrf-deployment