Advertisement
Guest User

Untitled

a guest
Jul 21st, 2018
291
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.03 KB | None | 0 0
  1. import time
  2. from pwn import *
  3.  
  4. standard_ops = set(['+', '-', '*', '/'])
  5. isTargetFound = False
  6.  
  7. def main():
  8.     start = time.time()
  9.     target = 14396.55
  10.     inputNumbers = ['9', '32', '52', '31', '41', '91', '81', '78']
  11.     stringToNumber = getAllPermutations(inputNumbers, target)
  12.  
  13.     for possible in stringToNumber:
  14.         if stringToNumber[possible] == target:
  15.             print("Took", time.time()-start, "seconds.")
  16.             print(str(possible))
  17.  
  18. def ctf():
  19.     global isTargetFound
  20.     r = remote('ppc-01.v7frkwrfyhsjtbpfcppnu.ctfz.one', 2445)
  21.     inp = r.recvline().decode("utf-8")
  22.  
  23.     while True:
  24.         numbers = inp.split()
  25.         target = float(numbers[len(numbers) - 1])
  26.         print('target: ', target, 'numbers: ', numbers[:-1])
  27.         start = time.time()
  28.         permutations = getAllPermutations(numbers[:-1], target)
  29.         isTargetFound = False
  30.         print("Took ", time.time()-start, " seconds.")
  31.         answer = ''
  32.         for possible in permutations:
  33.             if permutations[possible] == target:
  34.                 answer = str(possible)
  35.                 break
  36.         print(answer)
  37.         r.sendline(answer)
  38.         print('Answer: ', r.recvline().decode("utf-8"))
  39.         inp = r.recvline().decode("utf-8")
  40.  
  41.  
  42.  
  43. def getAllPermutations(inputNumbers, target, operations = standard_ops):
  44.     toReturn = dict()
  45.     consideredPermutations = set()
  46.     currentPermutation = tuple(inputNumbers)
  47.     toReturn.update(getNumbers(currentPermutation, target, operations))
  48.     return toReturn
  49.  
  50. # Get a map from an order of operations on the "inputNumbers"
  51. # (where operations are from "operations") to the value they produce.
  52. def getNumbers(inputNumbers, target, operations):
  53.     inputStrings = list()
  54.     newInputNumbers = list()
  55.     for inputNumber in inputNumbers:
  56.         inputStrings.append(str(inputNumber))
  57.         newInputNumbers.append(float(inputNumber))
  58.     return helpGetNumbers(inputStrings,
  59.                           newInputNumbers,
  60.                           operations,
  61.                           target,
  62.                           dict())
  63.  
  64. # Add to the map "answers" all the possible order of operations on the
  65. # "inputNumbers" (where operations are from "operations").
  66. # Keep track of the current state of the operations in "inputStrings".
  67. def helpGetNumbers(inputStrings,
  68.                    inputNumbers,
  69.                    operations,
  70.                    target,
  71.                    answers):
  72.     global isTargetFound
  73.     if isTargetFound:
  74.         return answers
  75.     if len(inputNumbers) == 1 and inputNumbers[0] == target:
  76.         isTargetFound = True
  77.         answers[inputStrings[0]] = inputNumbers[0]
  78.     else:
  79.         if len(inputNumbers) == 1:
  80.             answers[inputStrings[0]] = inputNumbers[0]
  81.         else:
  82.             for firstIndex in range(len(inputNumbers) - 1):
  83.                 for operation in operations:
  84.                     result = operate(operation,
  85.                                     inputNumbers[firstIndex],
  86.                                     inputNumbers[firstIndex + 1])
  87.                     if result != None:
  88.                         newString = "(" + inputStrings[firstIndex] + \
  89.                                     operation + inputStrings[firstIndex + 1] + ")"
  90.                         newNumbers, newStrings = replaceNumber(firstIndex,
  91.                                                             result,
  92.                                                             newString,
  93.                                                             inputNumbers,
  94.                                                             inputStrings)
  95.                         helpGetNumbers(newStrings,
  96.                                     newNumbers,
  97.                                     operations,
  98.                                     target,
  99.                                     answers)
  100.     return answers
  101. def replaceNumber(index,
  102.                   newResult,
  103.                   newString,
  104.                   inputNumbers,
  105.                   inputStrings):
  106.     newNumbers = list()
  107.     newStrings = list()
  108.     for currentIndex in range(index):
  109.         newNumbers.append(inputNumbers[currentIndex])
  110.         newStrings.append(inputStrings[currentIndex])
  111.     newNumbers.append(newResult)
  112.     newStrings.append(newString)
  113.     for currentIndex in range(index + 1, len(inputNumbers) - 1):
  114.         newNumbers.append(inputNumbers[currentIndex + 1])
  115.         newStrings.append(inputStrings[currentIndex + 1])
  116.     return newNumbers, newStrings
  117.  
  118. # Given a binary "operation", do the mathematical operation
  119. # on the two arguments.
  120. def operate(operation, firstNumber, secondNumber):
  121.     if operation == '+':
  122.         return firstNumber + secondNumber
  123.     if operation == '-':
  124.         return firstNumber - secondNumber
  125.     if operation == '*':
  126.         return firstNumber * secondNumber
  127.     if operation == '/':
  128.         return None if secondNumber == 0 else firstNumber / secondNumber
  129.     raise Exception("Unsupported operation: " + operation)
  130.  
  131. if __name__ == '__main__':
  132.     # main()
  133.     ctf()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement