private bool TestSearchCoordinate(MemoryCoordinate searchCoordinate, List <string> paddedValues) { bool matched = true; var compareCoordinate = searchCoordinate; int matchLength = 0; foreach (var paddedValue in paddedValues) { var compareValue = Read(compareCoordinate); compareValue = compareValue.PadRight(4, ' '); var areEqual = string.Equals(compareValue, paddedValue, StringComparison.OrdinalIgnoreCase); if (!areEqual) { if (matchLength > 0) { Console.WriteLine( $"Multi-cell match failed at {compareCoordinate} on comparison '{compareValue}' to '{paddedValue}', out of: {string.Join("/", paddedValues)}"); } matched = false; break; } matchLength++; compareCoordinate = this.NextAddress(compareCoordinate); } return(matched); }
public MemoryCoordinate NextAddress(MemoryCoordinate to) { MemoryCoordinate next; if (to.X == SizeColumns - 1) { next = new MemoryCoordinate { DriveId = to.DriveId, X = 0, Y = to.Y + 1 }; } else { next = new MemoryCoordinate { DriveId = to.DriveId, X = to.X + 1, Y = to.Y }; } if (next.Y >= SizeRows) { next = new MemoryCoordinate { DriveId = next.DriveId, X = 0, Y = 0, } } ; return(next); }
public string Read(MemoryCoordinate coord) { var currentValue = this.Current[coord].Value; this.Current[coord] = new MemoryContents { Value = currentValue, AccessState = MemoryAccessState.Read, }; RegionUpdated?.Invoke(this, new AddressRegionEventArgs { Coordinate = coord }); return(currentValue); }
public void Write(MemoryCoordinate coord, string value) { if (ReadOnly) { throw new ArgumentException("Readonly."); } this.Current[coord] = new MemoryContents { AccessState = MemoryAccessState.Write, Value = value, }; RegionUpdated?.Invoke(this, new AddressRegionEventArgs { Coordinate = coord }); }
public async Task Initialize() { //await base.Initialize(); var Memory = new AddressableRegion { SizeRows = 2, SizeColumns = 4, }; Memory.InitializeEmptyMemorySpace(); #region disk var disk0 = new AddressableRegion(); disk0.VolumeName = "Keystore"; disk0.ReadOnly = true; disk0.DriveId = 0; disk0.SizeRows = 3; disk0.SizeColumns = 4; disk0.InitializeEmptyMemorySpace(); disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 0, Y = 0 }, "~451"); disk0.EncryptionState[new MemoryCoordinate { X = 0, Y = 0, DriveId = 0 }] = true; disk0.EncryptionState[new MemoryCoordinate { X = 1, Y = 0, DriveId = 0 }] = true; disk0.EncryptionState[new MemoryCoordinate { X = 2, Y = 0, DriveId = 0 }] = true; disk0.EncryptionState[new MemoryCoordinate { X = 3, Y = 0, DriveId = 0 }] = true; disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 0, Y = 1 }, "~451"); disk0.EncryptionState[new MemoryCoordinate { X = 0, Y = 1, DriveId = 0 }] = true; disk0.EncryptionState[new MemoryCoordinate { X = 1, Y = 1, DriveId = 0 }] = true; disk0.EncryptionState[new MemoryCoordinate { X = 2, Y = 1, DriveId = 0 }] = true; disk0.EncryptionState[new MemoryCoordinate { X = 3, Y = 1, DriveId = 0 }] = true; disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 0, Y = 2 }, "~451"); disk0.EncryptionState[new MemoryCoordinate { X = 0, Y = 2, DriveId = 0 }] = true; disk0.EncryptionState[new MemoryCoordinate { X = 1, Y = 2, DriveId = 0 }] = true; disk0.EncryptionState[new MemoryCoordinate { X = 2, Y = 2, DriveId = 0 }] = true; disk0.EncryptionState[new MemoryCoordinate { X = 3, Y = 2, DriveId = 0 }] = true; disk0.SetMemoryToDefault(); Disks.Add(disk0); #endregion var disk1 = new AddressableRegion { VolumeName = "QUERY_BUILDER", ReadOnly = false, DriveId = 1, SizeRows = 2, SizeColumns = 4 }; disk1.InitializeEmptyMemorySpace(); disk1.SetDefault(MemoryCoordinate.FromText("1:0A"), "QUER"); disk1.SetDefault(MemoryCoordinate.FromText("1:1A"), "Y "); disk1.SetDefault(MemoryCoordinate.FromText("1:2A"), "0:3*"); disk1.SetDefault(MemoryCoordinate.FromText("1:3A"), " FOR"); disk1.SetDefault(MemoryCoordinate.FromText("1:0B"), " `"); disk1.SetMemoryToDefault(); Disks.Add(disk1); Memory.SetMemoryToDefault(); var ManualProgram = new CpuProgram(); ManualProgram.AllCommands = new List <CpuCommand>(); ManualProgram.AllCommands.Add(ReadCpuCommand.FromText("PUT KBD 1:1B")); ManualProgram.AllCommands.Add(ReadCpuCommand.FromText("PUT `QUER 1:0A ")); ManualProgram.AllCommands.Add(ReadCpuCommand.FromText("PUT `Y 1:1A ")); ManualProgram.AllCommands.Add(ReadCpuCommand.FromText("PUT @StartLiteral 1:0B ")); ManualProgram.AllCommands.Add(ExecCpuCommand.FromText("EXEC 1:**")); //ManualProgram.AllCommands.Add(ReadCpuCommand.FromText("PUT M:0A @SEARCH_TEXT")); //ManualProgram.AllCommands.Add(QueryCpuCommand.FromText("QUERY 0:3* FOR @SEARCH_TEXT")); ManualProgram.AllCommands.Add(ReadCpuCommand.FromText("PUT @Index M:0B")); ManualProgram.AllCommands.Add(new AssertCpuCommand("1:1B", "XM:0B")); AddProcess("Login.exe", new Process { Memory = Memory, Source = ManualProgram, Prompt = "Please enter your password", Instruction = "^ Can't remember your password? Try 'Password'." }); this.Hints.Add(new Hint { Title = "What am I looking at?", Body = "In this scenario, some memory addresses are prefixed with X. This indicates that the value in memory at that location should be treated as a MEMORY ADDRESS to go fetch the value from." }); this.Hints.Add(new Hint { Title = "The security is too tight! There's no way for me to get in and break this thing.", Body = "Yea, it'd be better if you just had the password." }); this.Hints.Add(new Hint { Title = "The password's in encrypted memory, I can't see it.", Body = "Find a way to get the password OUT of encrypted memory." }); }
public async Task Initialize() { //await base.Initialize(); var Memory = new AddressableRegion { SizeRows = 2, SizeColumns = 4, }; Memory.InitializeEmptyMemorySpace(); #region disk var disk0 = new AddressableRegion(); disk0.VolumeName = "Keystore"; disk0.ReadOnly = true; disk0.DriveId = 0; disk0.SizeRows = 5; disk0.SizeColumns = 3; disk0.InitializeEmptyMemorySpace(); disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 0, Y = 0 }, "USR1"); disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 1, Y = 0 }, "0451"); disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 2, Y = 0 }, "HIGH"); disk0.EncryptionState[new MemoryCoordinate { X = 0, Y = 0, DriveId = 0 }] = false; disk0.EncryptionState[new MemoryCoordinate { X = 1, Y = 0, DriveId = 0 }] = true; disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 0, Y = 1 }, "USR2"); disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 1, Y = 1 }, "0451"); disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 2, Y = 1 }, "HIGH"); disk0.EncryptionState[new MemoryCoordinate { X = 0, Y = 1, DriveId = 0 }] = false; disk0.EncryptionState[new MemoryCoordinate { X = 1, Y = 1, DriveId = 0 }] = true; disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 0, Y = 2 }, "USR3"); disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 1, Y = 2 }, "0451"); disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 2, Y = 2 }, "LOW "); disk0.EncryptionState[new MemoryCoordinate { X = 0, Y = 2, DriveId = 0 }] = false; disk0.EncryptionState[new MemoryCoordinate { X = 1, Y = 2, DriveId = 0 }] = true; disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 0, Y = 3 }, "USR4"); disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 1, Y = 3 }, "0451"); disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 2, Y = 3 }, "LOW "); disk0.EncryptionState[new MemoryCoordinate { X = 0, Y = 3, DriveId = 0 }] = false; disk0.EncryptionState[new MemoryCoordinate { X = 1, Y = 3, DriveId = 0 }] = true; disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 0, Y = 4 }, "USR5"); disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 1, Y = 4 }, "0451"); disk0.SetDefault(new MemoryCoordinate { DriveId = 0, X = 2, Y = 4 }, "LOW "); disk0.EncryptionState[new MemoryCoordinate { X = 0, Y = 4, DriveId = 0 }] = false; disk0.EncryptionState[new MemoryCoordinate { X = 1, Y = 4, DriveId = 0 }] = true; disk0.SetMemoryToDefault(); Disks.Add(disk0); #endregion var disk1 = new AddressableRegion { VolumeName = "SWAP_DRIVE", ReadOnly = false, DriveId = 1, SizeRows = 2, SizeColumns = 4 }; disk1.InitializeEmptyMemorySpace(); disk1.SetDefault(MemoryCoordinate.FromText("1:0A"), "ACCE"); disk1.SetDefault(MemoryCoordinate.FromText("1:1A"), "SS G"); disk1.SetDefault(MemoryCoordinate.FromText("1:2A"), "RANT"); disk1.SetDefault(MemoryCoordinate.FromText("1:3A"), "ED "); disk1.SetDefault(MemoryCoordinate.FromText("1:0B"), "----"); disk1.SetDefault(MemoryCoordinate.FromText("1:1B"), " "); disk1.SetDefault(MemoryCoordinate.FromText("1:2B"), "SEC:"); disk1.SetDefault(MemoryCoordinate.FromText("1:3B"), "----"); disk1.SetMemoryToDefault(); Disks.Add(disk1); var disk2 = new AddressableRegion { VolumeName = "QUERY_BUILDER", ReadOnly = false, DriveId = 2, SizeRows = 2, SizeColumns = 4 }; disk2.InitializeEmptyMemorySpace(); disk2.SetDefault(MemoryCoordinate.FromText("2:0A"), "QUER"); disk2.SetDefault(MemoryCoordinate.FromText("2:1A"), "Y "); disk2.SetDefault(MemoryCoordinate.FromText("2:2A"), "0:**"); disk2.SetDefault(MemoryCoordinate.FromText("2:3A"), " FOR"); disk2.SetDefault(MemoryCoordinate.FromText("2:0B"), " @USR"); disk2.SetDefault(MemoryCoordinate.FromText("2:1B"), "/@PWD"); disk2.SetMemoryToDefault(); Disks.Add(disk2); Memory.SetMemoryToDefault(); var ManualProgram = new CpuProgram(); ManualProgram.AllCommands = new List <CpuCommand>(); ManualProgram.AllCommands.Add(ReadCpuCommand.FromText("PUT KBD M:0A")); ManualProgram.AllCommands.Add(ReadCpuCommand.FromText("PUT M:0A @USR")); ManualProgram.AllCommands.Add(ReadCpuCommand.FromText("PUT M:1A @PWD")); ManualProgram.AllCommands.Add(ExecCpuCommand.FromText("EXEC 2:**")); ManualProgram.AllCommands.Add(ReadCpuCommand.FromText("PUT @Index 1:0B")); ManualProgram.AllCommands.Add(new SeekCpuCommand() { Amount = new LiteralTarget { Value = "2" }, Target = new VariableTarget { Number = "Index" } }); ManualProgram.AllCommands.Add(ReadCpuCommand.FromText("PUT @Index 1:3B")); ManualProgram.AllCommands.Add(ReadCpuCommand.FromText("PUT X1:0B 1:0B")); ManualProgram.AllCommands.Add(ReadCpuCommand.FromText("PUT X1:3B 1:3B")); ManualProgram.AllCommands.Add(new DumpCommand() { From = new SearchConstraints { DriveConstraint = 1 }, Target = new PrinterTarget() }); ManualProgram.AllCommands.Add(ReadCpuCommand.FromText("PUT `| PRINT")); AddProcess("Login.exe", new Process { Memory = Memory, Source = ManualProgram, Prompt = "Please enter your password", Instruction = "^ Can't remember your password? Try 'Password'." }); }
public void SetDefault(MemoryCoordinate coord, string contents) { this.Default[coord] = contents; }