Example #1
0
        static ExecutionResult Execute(ILoaderResult loaded)
        {
            // Loader Stage 2 - setup file
            var image = loaded.Image.ToArray();

            IKernel kernel;
            Agent   agent;

            if (loaded.GetType() == typeof(LoaderResult32))
            {
                Console.Out.WriteLine("Emulating Linux 32-bit kernel syscall interface");
                kernel = new Linux32Kernel();
                agent  = new Agent(kernel, image, ((LoaderResult32)loaded).EntryPoint);
            }
            else if (loaded.GetType() == typeof(LoaderResult64))
            {
                Console.Out.WriteLine("Emulating Linux 64-bit kernel syscall interface");
                kernel = new Linux64Kernel();
                agent  = new Agent64(kernel, image, ((LoaderResult64)loaded).EntryPoint);
            }
            else
            {
                throw new InvalidOperationException();
            }

            int?ret;

            do
            {
                ret = agent.Tick();
                //agent.Dump();
            } while (ret == null);
            switch (ret)
            {
            case -666:
                throw new Exception($"ERROR: Unknown bytecode!");

            case 0:
                Console.WriteLine("\r\n\r\nProgram terminated.");
                return(new ExecutionResult(0));

            default:
                Console.WriteLine("\r\n\r\nProgram errored out.");
                return(new ExecutionResult(ret ?? int.MinValue));
            }
        }
Example #2
0
        public void MOV_Bonanza64()
        {
            var programText = new string[] {
                "section	.text",
                "global _start",
                "_start:",
                "mov  rax, 0x1111222233334444 ;           rax = 0x1111222233334444",
                "mov  eax, 0x55556666         ; actual:   rax = 0x0000000055556666",
                "mov  rax, 0x1111222233334444 ;           rax = 0x1111222233334444",
                "mov  ax, 0x7777              ;           rax = 0x1111222233337777 (works!)",
                "mov  rax, 0x1111222233334444 ;           rax = 0x1111222233334444",
                "xor  eax, eax                ; actual:   rax = 0x0000000000000000",
                "                             ; again, it wiped whole register"
            };

            var compiler = new BytecodeCompiler <UInt64>();
            var compiled = compiler.Compile(programText, "UNIT_TEST");

            var agent = new Agent64(kernel, compiled.TextSegment, 0);
            var ret   = agent.Tick();

            Xunit.Assert.Null(ret);
            Xunit.Assert.Equal((ulong)0x1111222233334444, agent.ReadR64Register(Register.RAX));

            ret = agent.Tick();
            Xunit.Assert.Null(ret);
            Xunit.Assert.Equal((ulong)0x0000000055556666, agent.ReadR64Register(Register.RAX));

            ret = agent.Tick();
            Xunit.Assert.Null(ret);
            Xunit.Assert.Equal((ulong)0x1111222233334444, agent.ReadR64Register(Register.RAX));

            ret = agent.Tick();
            Xunit.Assert.Null(ret);
            Xunit.Assert.Equal((ulong)0x1111222233337777, agent.ReadR64Register(Register.RAX));

            ret = agent.Tick();
            Xunit.Assert.Null(ret);
            Xunit.Assert.Equal((ulong)0x1111222233334444, agent.ReadR64Register(Register.RAX));

            ret = agent.Tick();
            Xunit.Assert.Null(ret);
            Xunit.Assert.Equal((ulong)0x0000000000000000, agent.ReadR64Register(Register.RAX));
        }