1 #ifndef ROSE_BinaryAnalysis_Concolic_LinuxI386_H
2 #define ROSE_BinaryAnalysis_Concolic_LinuxI386_H
3 #include <featureTests.h>
4 #ifdef ROSE_ENABLE_CONCOLIC_TESTING
6 #include <Rose/BinaryAnalysis/Concolic/Architecture.h>
7 #include <Rose/BinaryAnalysis/Concolic/ExecutionEvent.h>
8 #include <Rose/BinaryAnalysis/Concolic/SharedMemory.h>
9 #include <Rose/BinaryAnalysis/Concolic/SystemCall.h>
10 #include <Rose/BinaryAnalysis/Debugger/Linux.h>
12 #include <boost/filesystem.hpp>
13 #include <Sawyer/Callbacks.h>
16 namespace BinaryAnalysis {
29 using Ptr = LinuxI386Ptr;
32 Debugger::Linux::Ptr debugger_;
33 rose_addr_t scratchVa_ = 0;
34 bool markingArgvAsInput_ =
true;
35 bool markingEnvpAsInput_ =
false;
38 LinuxI386(
const DatabasePtr&, TestCaseId,
const Partitioner2::Partitioner&);
48 static Ptr instance(
const DatabasePtr&, TestCaseId,
const Partitioner2::Partitioner&);
49 static Ptr instance(
const DatabasePtr&,
const TestCasePtr&,
const Partitioner2::Partitioner&);
55 Debugger::Linux::Ptr debugger()
const;
59 RegisterDescriptor systemCallReturnRegister();
63 virtual void configureSystemCalls()
override;
64 virtual void configureSharedMemory()
override;
65 virtual void load(
const boost::filesystem::path&)
override;
66 virtual bool isTerminated()
override;
67 virtual ByteOrder::Endianness memoryByteOrder()
override;
68 virtual std::string readCString(rose_addr_t va,
size_t maxBytes =
UNLIMITED)
override;
69 virtual rose_addr_t ip()
override;
70 virtual void ip(rose_addr_t)
override;
71 virtual std::vector<ExecutionEventPtr> createMemoryRestoreEvents()
override;
72 virtual std::vector<ExecutionEventPtr> createMemoryHashEvents()
override;
73 virtual std::vector<ExecutionEventPtr> createMemoryAdjustEvents(
const MemoryMap::Ptr&, rose_addr_t insnVa)
override;
74 virtual std::vector<ExecutionEventPtr> createRegisterRestoreEvents()
override;
75 virtual bool playEvent(
const ExecutionEventPtr&)
override;
76 virtual void mapMemory(
const AddressInterval&,
unsigned permissions)
override;
78 virtual size_t writeMemory(rose_addr_t,
const std::vector<uint8_t>&)
override;
79 virtual std::vector<uint8_t> readMemory(rose_addr_t,
size_t)
override;
80 virtual void writeRegister(RegisterDescriptor, uint64_t)
override;
83 virtual void executeInstruction(
const Partitioner2::Partitioner&)
override;
85 virtual void createInputVariables(
const Partitioner2::Partitioner&,
const Emulation::RiscOperatorsPtr&,
87 virtual void systemCall(
const Partitioner2::Partitioner&,
92 void mapScratchPage();
100 std::vector<MemoryMap::ProcessMapRecord> disposableMemory();
103 void unmapAllMemory();
107 uint64_t systemCallFunctionNumber(
const Partitioner2::Partitioner&,
112 systemCallArgument(
const Partitioner2::Partitioner&,
117 systemCallReturnValue(
const Partitioner2::Partitioner&,
122 systemCallReturnValue(
const Partitioner2::Partitioner&,
135 class LinuxI386SyscallBase:
public SyscallCallback {
136 ExecutionEventPtr latestReturnEvent_;
137 ExecutionEventPtr penultimateReturnEvent_;
140 LinuxI386SyscallBase();
141 virtual ~LinuxI386SyscallBase();
148 void hello(
const std::string &name,
const SyscallContext&)
const;
155 virtual void playback(SyscallContext&) = 0;
174 virtual void handlePreSyscall(SyscallContext&) {}
175 virtual void handlePostSyscall(SyscallContext&) = 0;
192 ExecutionEventPtr latestReturnEvent()
const;
193 ExecutionEventPtr penultimateReturnEvent()
const;
200 void showRecentReturnValues(std::ostream&,
const SyscallContext&)
const;
207 SymbolicExpressionPtr penultimateSymbolicReturn()
const;
211 virtual bool operator()(
bool , SyscallContext&) override final;
219 class LinuxI386SyscallUnimplemented: public LinuxI386SyscallBase {
221 LinuxI386SyscallUnimplemented();
223 ~LinuxI386SyscallUnimplemented();
227 static Ptr instance();
229 void playback(SyscallContext&)
override;
230 void handlePostSyscall(SyscallContext&)
override;
237 class LinuxI386SyscallReturnsInput:
public LinuxI386SyscallBase {
239 LinuxI386SyscallReturnsInput();
241 ~LinuxI386SyscallReturnsInput();
245 static Ptr instance();
247 void playback(SyscallContext&)
override;
248 void handlePostSyscall(SyscallContext&)
override;
252 class LinuxI386SyscallTerminates:
public LinuxI386SyscallBase {
254 LinuxI386SyscallTerminates();
256 ~LinuxI386SyscallTerminates();
260 static Ptr instance();
262 void playback(SyscallContext&)
override;
263 void handlePostSyscall(SyscallContext&)
override;
269 class LinuxI386SyscallReturn:
public LinuxI386SyscallBase {
271 LinuxI386SyscallReturn();
273 ~LinuxI386SyscallReturn();
282 virtual std::pair<SymbolicExpressionPtr, Sawyer::Optional<uint64_t>> makeReturnConstraint(SyscallContext&) = 0;
285 void handlePostSyscall(SyscallContext&) override final;
293 class LinuxI386SyscallConstant: public LinuxI386SyscallReturn {
295 LinuxI386SyscallConstant();
297 ~LinuxI386SyscallConstant();
301 static Ptr instance();
303 void playback(SyscallContext&)
override;
304 std::pair<SymbolicExpressionPtr, Sawyer::Optional<uint64_t>> makeReturnConstraint(SyscallContext&)
override;
310 class LinuxI386SyscallNondecreasing:
public LinuxI386SyscallReturn {
312 LinuxI386SyscallNondecreasing();
314 ~LinuxI386SyscallNondecreasing();
318 static Ptr instance();
320 void playback(SyscallContext&)
override;
321 std::pair<SymbolicExpressionPtr, Sawyer::Optional<uint64_t>> makeReturnConstraint(SyscallContext&)
override;
325 class LinuxI386SyscallAccess:
public LinuxI386SyscallBase {
327 LinuxI386SyscallAccess();
329 ~LinuxI386SyscallAccess();
333 static Ptr instance();
335 void playback(SyscallContext&)
override;
336 void handlePostSyscall(SyscallContext&)
override;
340 class LinuxI386SyscallBrk:
public LinuxI386SyscallBase {
342 LinuxI386SyscallBrk();
344 ~LinuxI386SyscallBrk();
348 static Ptr instance();
350 void playback(SyscallContext&)
override;
351 void handlePostSyscall(SyscallContext&)
override;
355 class LinuxI386SyscallMmap2:
public LinuxI386SyscallBase {
357 LinuxI386SyscallMmap2();
359 ~LinuxI386SyscallMmap2();
363 static Ptr instance();
365 void playback(SyscallContext&)
override;
366 void handlePostSyscall(SyscallContext&)
override;
370 class LinuxI386SyscallOpenat:
public LinuxI386SyscallBase {
372 LinuxI386SyscallOpenat();
374 ~LinuxI386SyscallOpenat();
378 static Ptr instance();
380 void playback(SyscallContext&)
override;
381 void handlePostSyscall(SyscallContext&)
override;
SmtSolverPtr Ptr
Reference counting pointer for SMT solvers.
boost::shared_ptr< RiscOperators > RiscOperatorsPtr
Shared-ownership pointer to a RISC operators object.
Base class for machine instructions.
Main namespace for the ROSE library.
const size_t UNLIMITED(static_cast< size_t >(-1))
Effictively unlimited size.
MemoryMapPtr Ptr
Reference counting pointer.
ROSE_DLL_API void load(SgProject *project, std::list< std::string > const &filepaths)
Load ASTs that have been saved to files.
const char * Architecture(int64_t)
Convert Rose::BinaryAnalysis::Disassembler::Mips::Decoder::Architecture enum constant to a string...
Sawyer::SharedPointer< SValue > SValuePtr
Shared-ownership pointer to a semantic value in any domain.
Sawyer::SharedPointer< Node > Ptr
Reference counting pointer.