From 3e1e3ea3573b4a3d06b5ee0bdb5ba9ca6a84b5a4 Mon Sep 17 00:00:00 2001 From: Langston Barrett Date: Thu, 19 Dec 2024 10:56:26 -0500 Subject: [PATCH] dump: Add a command to print out the `Data.Macaw.Memory.Memory` Also, update the `macaw-loader` submodule to bring in `macaw-loader-riscv`. --- cabal.project.dist | 1 + deps/macaw-loader | 2 +- .../macaw-aarch32-symbolic.cabal | 1 + macaw-aarch32-symbolic/tools/Dump.hs | 1 + macaw-dump/macaw-dump.cabal | 2 + macaw-dump/src/Data/Macaw/Dump.hs | 4 ++ macaw-dump/src/Data/Macaw/Dump/CLI.hs | 9 ++++ macaw-dump/src/Data/Macaw/Dump/Memory.hs | 51 +++++++++++++++++++ macaw-ppc-symbolic/macaw-ppc-symbolic.cabal | 1 + macaw-ppc-symbolic/tools/Dump.hs | 1 + .../macaw-riscv-symbolic.cabal | 1 + macaw-riscv-symbolic/tools/Dump32.hs | 1 + macaw-riscv-symbolic/tools/Dump64.hs | 1 + x86_symbolic/macaw-x86-symbolic.cabal | 1 + x86_symbolic/tools/Dump.hs | 1 + 15 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 macaw-dump/src/Data/Macaw/Dump/Memory.hs diff --git a/cabal.project.dist b/cabal.project.dist index b6a51543..ccc802ac 100644 --- a/cabal.project.dist +++ b/cabal.project.dist @@ -21,6 +21,7 @@ packages: base/ deps/macaw-loader/macaw-loader deps/macaw-loader/macaw-loader-aarch32 deps/macaw-loader/macaw-loader-ppc + deps/macaw-loader/macaw-loader-riscv deps/macaw-loader/macaw-loader-x86 deps/semmc/semmc/ deps/semmc/semmc-ppc/ diff --git a/deps/macaw-loader b/deps/macaw-loader index b291f57a..57ebded9 160000 --- a/deps/macaw-loader +++ b/deps/macaw-loader @@ -1 +1 @@ -Subproject commit b291f57a24e17d45c0ee6973026bc5f7c0ba5d9f +Subproject commit 57ebded959aea6a28644a278e32c734c9b24e972 diff --git a/macaw-aarch32-symbolic/macaw-aarch32-symbolic.cabal b/macaw-aarch32-symbolic/macaw-aarch32-symbolic.cabal index ae3fa00d..d0c93d2f 100644 --- a/macaw-aarch32-symbolic/macaw-aarch32-symbolic.cabal +++ b/macaw-aarch32-symbolic/macaw-aarch32-symbolic.cabal @@ -57,6 +57,7 @@ executable macaw-aarch32-dump macaw-aarch32, macaw-aarch32-symbolic, macaw-dump, + macaw-loader-aarch32, macaw-symbolic test-suite macaw-aarch32-symbolic-tests diff --git a/macaw-aarch32-symbolic/tools/Dump.hs b/macaw-aarch32-symbolic/tools/Dump.hs index 09b0bf03..f24a2561 100644 --- a/macaw-aarch32-symbolic/tools/Dump.hs +++ b/macaw-aarch32-symbolic/tools/Dump.hs @@ -14,6 +14,7 @@ module Main (main) where import Data.Macaw.ARM.ARMReg () import Data.Macaw.AArch32.Symbolic () import Data.Macaw.ARM qualified as MA +import Data.Macaw.BinaryLoader.AArch32 () import Data.Macaw.Dump qualified as MD import Data.Macaw.Symbolic qualified as MS import Data.Proxy (Proxy(..)) diff --git a/macaw-dump/macaw-dump.cabal b/macaw-dump/macaw-dump.cabal index 73da54e5..b8b6c6ab 100644 --- a/macaw-dump/macaw-dump.cabal +++ b/macaw-dump/macaw-dump.cabal @@ -89,6 +89,7 @@ library elf-edit, lens, macaw-base, + macaw-loader, macaw-symbolic, optparse-applicative, parameterized-utils, @@ -103,4 +104,5 @@ library Data.Macaw.Dump.CLI Data.Macaw.Dump.CLIUtils Data.Macaw.Dump.Discover + Data.Macaw.Dump.Memory Data.Macaw.Dump.Plt diff --git a/macaw-dump/src/Data/Macaw/Dump.hs b/macaw-dump/src/Data/Macaw/Dump.hs index a5f5082c..e6b690ca 100644 --- a/macaw-dump/src/Data/Macaw/Dump.hs +++ b/macaw-dump/src/Data/Macaw/Dump.hs @@ -11,11 +11,13 @@ import Data.ElfEdit qualified as EE import Data.Macaw.Architecture.Info qualified as MAI import Data.Macaw.Dump.CLI qualified as MDC import Data.Macaw.Dump.Discover qualified as MDD +import Data.Macaw.Dump.Memory qualified as MDM import Data.Macaw.Dump.Plt qualified as MDP import Data.Macaw.CFG qualified as MC import Data.Macaw.Memory.ElfLoader.PLTStubs qualified as MMEP import Data.Macaw.Symbolic qualified as MS import Lang.Crucible.CFG.Extension qualified as CCE +import Data.Macaw.BinaryLoader qualified as Loader main :: ( MS.GenArchInfo MS.LLVMMemory arch @@ -23,6 +25,7 @@ main :: , MC.ArchConstraints arch , MC.ArchAddrWidth arch ~ EE.RelocationWidth reloc , EE.IsRelocationType reloc + , Loader.BinaryLoader arch (EE.ElfHeaderInfo (MC.ArchAddrWidth arch)) ) => MAI.ArchitectureInfo arch -> MS.GenArchVals mem arch -> @@ -32,4 +35,5 @@ main archInfo archVals pltStubInfo = do cli <- MDC.parseCli case MDC.cliCommand cli of MDC.CommandDiscover cfg -> MDD.discover archInfo archVals cfg + MDC.CommandMemory cfg -> MDM.memory archInfo cfg MDC.CommandPlt cfg -> MDP.plt archInfo pltStubInfo cfg diff --git a/macaw-dump/src/Data/Macaw/Dump/CLI.hs b/macaw-dump/src/Data/Macaw/Dump/CLI.hs index 4ac10786..693df2bd 100644 --- a/macaw-dump/src/Data/Macaw/Dump/CLI.hs +++ b/macaw-dump/src/Data/Macaw/Dump/CLI.hs @@ -10,11 +10,13 @@ module Data.Macaw.Dump.CLI import Control.Applicative ((<**>)) import Data.Macaw.Dump.Discover qualified as MDD +import Data.Macaw.Dump.Memory qualified as MDM import Data.Macaw.Dump.Plt qualified as MDP import Options.Applicative qualified as Opt data Command = CommandDiscover MDD.DiscoverConfig + | CommandMemory MDM.MemoryConfig | CommandPlt MDP.PltConfig command :: Opt.Parser Command @@ -22,6 +24,7 @@ command = Opt.subparser $ mconcat [ cmdDiscover + , cmdMemory , cmdPlt ] where @@ -31,6 +34,12 @@ command = "discover" (Opt.info (CommandDiscover <$> MDD.discoverConfig) (Opt.progDesc "Perform code discovery and print CFGs")) + cmdMemory :: Opt.Mod Opt.CommandFields Command + cmdMemory = do + Opt.command + "memory" + (Opt.info (CommandMemory <$> MDM.memoryConfig) (Opt.progDesc "Print program memory")) + cmdPlt :: Opt.Mod Opt.CommandFields Command cmdPlt = do Opt.command diff --git a/macaw-dump/src/Data/Macaw/Dump/Memory.hs b/macaw-dump/src/Data/Macaw/Dump/Memory.hs new file mode 100644 index 00000000..2c76ed86 --- /dev/null +++ b/macaw-dump/src/Data/Macaw/Dump/Memory.hs @@ -0,0 +1,51 @@ +{-# LANGUAGE ImportQualifiedPost #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TypeApplications #-} +{-# LANGUAGE FlexibleContexts #-} + +module Data.Macaw.Dump.Memory + ( MemoryConfig(..) + , memoryConfig + , memory + ) where + +import Data.ElfEdit qualified as EE +import Data.Macaw.Architecture.Info qualified as MAI +import Data.Macaw.BinaryLoader qualified as Loader +import Data.Macaw.CFG.Core qualified as MC +import Data.Macaw.Dump.CLIUtils qualified as MDCU +import Data.Macaw.Memory.LoadCommon qualified as LC +import Data.Macaw.Memory qualified as MM +import Options.Applicative qualified as Opt + +data MemoryConfig + = MemoryConfig + { memBinPath :: FilePath + } + +memoryConfig :: Opt.Parser MemoryConfig +memoryConfig = + MemoryConfig + <$> MDCU.binOpt + +-- Currently, we do not apply any offsets to addresses in the loaded binary. We +-- will need to reconsider this if we want to support shared libraries. +loadOptions :: LC.LoadOptions +loadOptions = + LC.LoadOptions + { LC.loadOffset = Nothing + } + +memory :: + forall arch. + ( MM.MemWidth (MC.ArchAddrWidth arch) + , Loader.BinaryLoader arch (EE.ElfHeaderInfo (MC.ArchAddrWidth arch)) + ) => + MAI.ArchitectureInfo arch -> + MemoryConfig -> + IO () +memory archInfo cfg = do + ehi <- MDCU.loadElf archInfo (memBinPath cfg) + loaded <- Loader.loadBinary @arch loadOptions ehi + let mem = Loader.memoryImage loaded + print mem diff --git a/macaw-ppc-symbolic/macaw-ppc-symbolic.cabal b/macaw-ppc-symbolic/macaw-ppc-symbolic.cabal index a1a20d8e..73f7c9d9 100644 --- a/macaw-ppc-symbolic/macaw-ppc-symbolic.cabal +++ b/macaw-ppc-symbolic/macaw-ppc-symbolic.cabal @@ -53,6 +53,7 @@ executable macaw-ppc-dump elf-edit, macaw-base, macaw-dump, + macaw-loader-ppc, macaw-ppc, macaw-ppc-symbolic, macaw-symbolic diff --git a/macaw-ppc-symbolic/tools/Dump.hs b/macaw-ppc-symbolic/tools/Dump.hs index f90070fd..7ce7489b 100644 --- a/macaw-ppc-symbolic/tools/Dump.hs +++ b/macaw-ppc-symbolic/tools/Dump.hs @@ -5,6 +5,7 @@ module Main (main) where import Data.ElfEdit qualified as EE +import Data.Macaw.BinaryLoader.PPC () import Data.Macaw.Dump qualified as MD import Data.Macaw.Memory.ElfLoader.PLTStubs qualified as MMEP import Data.Macaw.PPC qualified as PPC diff --git a/macaw-riscv-symbolic/macaw-riscv-symbolic.cabal b/macaw-riscv-symbolic/macaw-riscv-symbolic.cabal index 82097630..fabaf228 100644 --- a/macaw-riscv-symbolic/macaw-riscv-symbolic.cabal +++ b/macaw-riscv-symbolic/macaw-riscv-symbolic.cabal @@ -137,6 +137,7 @@ executable macaw-riscv64-dump containers, grift, macaw-dump, + macaw-loader-riscv, macaw-riscv, macaw-riscv-symbolic, macaw-symbolic diff --git a/macaw-riscv-symbolic/tools/Dump32.hs b/macaw-riscv-symbolic/tools/Dump32.hs index ba25afb6..34b6e0d8 100644 --- a/macaw-riscv-symbolic/tools/Dump32.hs +++ b/macaw-riscv-symbolic/tools/Dump32.hs @@ -3,6 +3,7 @@ module Main (main) where +import Data.Macaw.BinaryLoader.RISCV () import Data.Macaw.Dump qualified as MD import Data.Macaw.RISCV qualified as MR import Data.Macaw.RISCV.Symbolic () diff --git a/macaw-riscv-symbolic/tools/Dump64.hs b/macaw-riscv-symbolic/tools/Dump64.hs index 12c66d3a..d616dc56 100644 --- a/macaw-riscv-symbolic/tools/Dump64.hs +++ b/macaw-riscv-symbolic/tools/Dump64.hs @@ -3,6 +3,7 @@ module Main (main) where +import Data.Macaw.BinaryLoader.RISCV () import Data.Macaw.Dump qualified as MD import Data.Macaw.RISCV qualified as MR import Data.Macaw.RISCV.Symbolic () diff --git a/x86_symbolic/macaw-x86-symbolic.cabal b/x86_symbolic/macaw-x86-symbolic.cabal index 2c887b51..b80247e6 100644 --- a/x86_symbolic/macaw-x86-symbolic.cabal +++ b/x86_symbolic/macaw-x86-symbolic.cabal @@ -48,6 +48,7 @@ executable macaw-x86-dump base, containers, macaw-x86, + macaw-loader-x86, macaw-x86-symbolic, macaw-dump, macaw-symbolic diff --git a/x86_symbolic/tools/Dump.hs b/x86_symbolic/tools/Dump.hs index 00502955..074c950e 100644 --- a/x86_symbolic/tools/Dump.hs +++ b/x86_symbolic/tools/Dump.hs @@ -3,6 +3,7 @@ module Main (main) where +import Data.Macaw.BinaryLoader.X86 () import Data.Macaw.Dump qualified as MD import Data.Macaw.Symbolic qualified as MS import Data.Macaw.X86 qualified as MX