2019北邮网安杯官方解题报告——Re3


Re3

程序加了壳,壳是变形的upx壳,脱壳找到oepdump内存。oep位置如下图:

OEP位置

分析dump内存,查看main函数:

main函数

程序获取了自身一个名为BIN的资源,将其带入了0x401110函数。

0x401110对BIN资源的操作

程序对获取到的资源pSource进行了Size次异或0x77,即解密,对解密后的资源进行一系列和PE结构相关的操作,即内存释放DLL,其中涉及判断是否该资源为DLL,将资源以内存布局加载,修改IAT表以及重定位RELOC表,最后从DllMain函数启动。其中有两处反调试,如果调试,需要留意。

获取解密后的DLLIDA进行分析:

DllMain

分析线程函数0x10001000

flag验算逻辑

11个未知数,每个未知数4字节,11个方程求解,脚本如下:

  from z3 import *
import struct
cmpValue = [3350593028, 3187659634, 1962716233, 1695120199, 2164708281, 281870293, 4234765510, 1710951488, 3280612146, 907270479, 3620629970]
randNum = [130, 35, 99, 184, 1, 60, 50, 24, 27, 209, 161, 56, 5, 192, 46, 177, 128, 45, 141, 30, 201, 80, 161, 85, 88, 206, 148, 55, 139, 154, 177, 239, 173, 25, 37, 25, 153, 220, 33, 142, 155, 195, 64, 184, 231, 31, 55, 64, 251, 95, 28, 129, 7, 93, 188, 181, 212, 123, 161, 124, 160, 156, 76, 232, 239, 156, 138, 128, 201, 165, 210, 92, 37, 189, 68, 189, 17, 18, 151, 31, 171, 205, 233, 140, 80, 70, 214, 16, 250, 162, 89, 127, 230, 123, 76, 80, 244, 153, 94, 197, 36, 192, 95, 99, 75, 227, 112, 1, 93, 118, 69, 198, 29, 221, 148, 15, 166, 98, 44, 181, 56]

s = Solver()
a = [BitVec("a%d"%i, 32) for i in range(11)]

for j in range(11):
   calValue = 0
   for i in range(11):
       calValue += a[i]*randNum[11*j+i]
       calValue &= 0xffffffff
       s.add(calValue == cmpValue[j])

while(s.check() == sat):
   m = s.model()
   for i in a:
       print m[i],
   print ""
   exp = []
   for val in a:
       exp.append(val != m[val])
   s.add(Or(exp))

flagint = "1414550850 1819235195 1735289206 1848656735 1634890805 1937010225 1985169759 1601794661 1702129201 1949656434 2103930417"
tmp = flagint.split(" ")
flag = ""

for i in tmp:
   val = (int(i))
   # print val
   tmp = struct.pack("<I",val)
   flag += tmp
print flag


可求出两组解,其中一组解均为可见字符,另外一组舍弃。

得到flagBUPT{Solving_C0n5tra1nts_ISvery_1ntere5t1ng}

最新回复 (0)
返回
发新帖