# DOT Securinets DOT challenge This is a small VM challenge, where the opcodes are fetched from a database at runtime. The operation happens on our input array, so eventually these operations change the value inside the array and then the array is `UTF-8` encoded and then converted to a base-64 string We first get the base64 decoded array and then we can use Z3 to get our flag ## Reverse the base-64 string * size(char) - 2 bytes in C# * if the ASCII value of a character is more than 0x7f, `UTF-8` encoding scheme adds `0xc2`,`0xc3` accordingly as the MSB * This gives out an array of length 58 when normally decode, To avoid this we encode our base64 decoded string in `UTF-8` and then convert it to char array To reverse this, we first decode the base-64 string to bytes and then convert to `char` array with `utf-8` encoding C# script to get the decoded bytearray ```cs var decoded_str = Convert.FromBase64String("w4Vkw4bDqcOxwqbDj8OKw7XDmcOqZHLDinBdw4/Dul9mw4JfbsOIaG7Dil3DmWxfbMOTwr3DkWJoYg=="); char[] to_cmp = Encoding.UTF8.GetString(decoded_str).ToCharArray(); foreach (Int16 item in to_cmp) { Console.Write(item); Console.Write(","); } ``` ## Use Z3 to get our flag Now we have the array we can Use z3 to get our input ```py import mysql.connector from mysql.connector import Error from z3 import * text = 'c2hpZmwK00c2hpZmwK01c2hpZmwK02c2hpZmwK03c2hpZmwK04c2hpZmwK05c2hpZmwK06c2hpZmwK07c2hpZmwK08c2hpZmwK09c2hpZmwK0ac2hpZmwK0bc2hpZmwK0cc2hpZmwK0dc2hpZmwK0ec2hpZmwK0fc2hpZmwK10c2hpZmwK11c2hpZmwK12c2hpZmwK13c2hpZmwK14c2hpZmwK15c2hpZmwK16c2hpZmwK17c2hpZmwK18c2hpZmwK19c2hpZmwK1ac2hpZmwK1bc2hpZmwK1cc2hpZmwK1dc2hpZmwK1ec2hpZmwK1fc2hpZmwK20c2hpZmwK21c2hpZmwK22c2hpZmwK23c2hpZmwK24c2hpZmwK25b3BYT1IK000005b3BYT1IK050005b3BYT1IK000005b3BYT1IK03030Ab3BYT1IK0A030Ab3BYT1IK03030Ab3BfcGwK040db3BfcGwK080db3BfcGwK0c0db3BfcGwK100db3BfcGwK140db3BfcGwK180db3BfcGwK1c0db3BfcGwK200db3BfcGwK240db3BYT1IK141422b3BYT1IK221422b3BYT1IK141422b3BYT1IK252511b3BYT1IK112511b3BYT1IK252511b3BYT1IK010121b3BYT1IK210121b3BYT1IK010121b3BYT1IK0b0b16b3BYT1IK160b16b3BYT1IK0b0b16b3BfTUkK000db3BfTUkK030db3BfTUkK060db3BfTUkK090db3BfTUkK0c0db3BfTUkK0f0db3BfTUkK120db3BfTUkK150db3BfTUkK180db3BfTUkK1b0db3BfTUkK1e0db3BfTUkK210db3BfTUkK240d' id_array = ['q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'q', 'd', 'd', 'd', 'd', 'd', 'd', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'd', 'm', 'm', 'm', 'm', 'm', 'm', 'm', 'm', 'm', 'm', 'm', 'm', 'm'] array = [BitVec('a%s'%i,32) for i in range(38)] sol = Solver() for i in array: sol.add(i>31) sol.add(i<128) try: connection = mysql.connector.connect(host="20.233.43.53",user="QUALS", password="QUALS",port = 3306,database='strings') if connection.is_connected(): mySql_Create_Table_Query = """select * from ENI1;""" cursor = connection.cursor() cursor.execute(mySql_Create_Table_Query) for x in cursor: text = x[0] num = 0 while(num<len(text)): text2 = text[num:num+8] cursor.execute("select id from ENI where str=\"" + text2 + "\";") for x in cursor: one_char = x[0] if one_char=="d": num2 = int(text[num+8:num+8+2],16) num3 = int(text[num+10:num+10+2],16) num4 = int(text[num+12:num+12+2],16) array[num2] = (array[num3] ^array[num4]) num+=14 elif one_char=="G": num2 = int(text[num+8:num+8+2],16) num3 = int(text[num+10:num+10+2],16) array[num2] = (array[num2] + num3) num+=12 elif one_char=="m": num2 = int(text[num+8:num+8+2],16) num3 = int(text[num+10:num+10+2],16) array[num2] = (array[num2] - num3) num += 12 elif one_char=="q": num2 = int(text[num+8:num+8+2],16) array[num2] = (array[num2]<<1) num += 10 # from C# code to_cmp = [197,100,198,233,241,166,207,202,245,217,234,100,114,202,112,93,207,250,95,102,194,95,110,200,104,110,202,93,217,108,95,108,211,189,209,98,104,98] for i in range(len(array)): sol.add(to_cmp[i]==array[i]) if sol.check()==sat: b=sol.model() array = [BitVec('a%s'%i,32) for i in range(38)] for i in array: print(chr(int(str(b[i]))),end='') else: print(sol.check()) except Error as e: print("\n[*] Connection Failed", e) finally: if connection.is_connected(): cursor.close() connection.close() print("\n[*] Connection closed") ``` ###### flag: `Securinets{79e85a163b62d47e5f666c2a14}` ###### tags: `Z3` `vm` `CTF`