解题过程

IDA打开,发现目标程序进行了混淆,进一步分析,可以知道使用了ollvm进行了混淆。
image.png
使用工具中的deflat.py脚本,去除混淆的代码。

  1. python deflat.py shift_exercise 0x401170

去除之后,生成shift_exercise_recovered文件,IDA继续分析,仍然存在无用的控制流程。
image.png
进一步使用IDA插件script.py进行处理,获得更为直观的伪代码。
image.png
分析伪代码可以知道,该算法为修改过的crc64算法,依据加密算法,写出解密算法。

  1. def multiply(multiplier_a, multiplier_b):
  2. tmp = [0] * 64
  3. res = 0
  4. for i in range(64):
  5. tmp[i] = (multiplier_a << i) * ((multiplier_b >> i) & 1)
  6. res ^= tmp[i]
  7. return res
  8. def find_highest_bit(value):
  9. i = 0
  10. while value != 0:
  11. i += 1
  12. value >>= 1
  13. return i
  14. def divide(numerator, denominator):
  15. quotient = 0
  16. tmp = numerator
  17. bit_count = find_highest_bit(tmp) - find_highest_bit(denominator)
  18. while bit_count >= 0:
  19. quotient |= (1<< bit_count)
  20. tmp ^= (denominator << bit_count)
  21. bit_count = find_highest_bit(tmp) - find_highest_bit(denominator)
  22. remainder = tmp
  23. return quotient, remainder
  24. def reverse(x, bits):
  25. bin_x = bin(x)[2:].rjust(bits, '0')
  26. re_bin_x = bin_x[::-1]
  27. returnint(re_bin_x, 2)
  28. cipher = [0x32e9a65483cc9671, 0xec92a986a4af329c, 0x96c8259bc2ac4673,
  29. 0x74bf5dca4423530f, 0x59d78ef8fdcbfab1, 0xa65257e5b13942b1]
  30. res = b""
  31. for a in cipher:
  32. d = 0xb1234b7679fc4b3d
  33. rr = reverse(a, 64)
  34. rd = reverse((1<< 64) + d, 65)
  35. q, r = divide(rr << 64, rd)
  36. r = reverse(r, 64)
  37. for i in range(8):
  38. res += bytes([r & 0xff])
  39. r >>= 8
  40. print(res)
  41. print(res.decode())