刘功瑞的博客

有一天你突然惊醒,发现这一切,都只不过是一场梦。

攻防世界 XCTF Reverse Newbie_calculations Writeup

image.png

这题挺有意思的,直接执行,输出几个字后一直运行,可以听到电脑飞速运转的声音

image.png

说明在运行什么计算。

ida打开后看到如下:

image.png

非常复杂的计算,点开第一个函数sub_401100看下内容

image.png

看起来也是非常复杂,但是经过观察发现,有很多无用的干扰项,真正有用的计算就是循环a2次的sub_401000计算,点进去sub_401000

image.png

观察后发现,实际参与计算的是 循环 v4 次 --a1,v4 = -1 -a2 +1 = -a2 , -a2在汇编中可以用 100000000-a2 表示,第一个while循环得到  a1 - (100000000-a2)

第二个循环就是 -1次,也就是FFFFFFFF = 100000000-1,结合第一个while得到 a1 - (100000000 - a2)+(100000000 - 1) +1 = a1 + a2,也就是说sub_401000 实际就是一个加法函数,并将结果赋值给第一个参数a1,然后重命名为add,方便后面识别

重命名后再回头看sub_401100

image.png

第一个while实际是循环a2次add(&v8,*a1),也就是a1*a2,后面第二个while对结果没影响,sub_401100就是乘法,给他重命名为multiply

然后看sub_401220 也是看实际参与计算的值,得到a1 + (100000000 - a2) + (100000000 - 1) +1 = a1 -a2    因为100000000在汇编中代表0。函数重命名为sub

image.png


回到主程序,运算过程就清晰多了

image.png


没有接收返回值的函数就是我们要的flag中的各个字符

image.png

由于重装系统了,没有安装c++环境,用c++运行应该更方便,我改成python版本的,运行就出flag了

def multiply(a, b):
    return a * b


def add(a, b):
    return a + b


def sub(a, b):
    return a - b


v120 = [1 for i in range(32)]
v121 = 0
print ("Your flag is:")
v3 = multiply(v120[0], 1000000000)
v4 = sub(v3, 999999950)
v120[0] = multiply(v4, 2)
v5 = add(v120[1], 5000000)

v6 = sub(v5, 6666666)
v7 = add(v6, 1666666)
v8 = add(v7, 45)

v9 = multiply(v8, 2)
v120[1] = add(v9, 5)
v10 = multiply(v120[2], 1000000000)
v11 = sub(v10, 999999950)
v12 = multiply(v11, 2)
v120[2] = add(v12, 2)
v13 = add(v120[3], 55)

v14 = sub(v13, 3)
v15 = add(v14, 4)

v120[3] = sub(v15, 1)
v16 = multiply(v120[4], 100000000)
v17 = sub(v16, 99999950)
v18 = multiply(v17, 2)
v120[4] = add(v18, 2)
v19 = sub(v120[5], 1)
v20 = multiply(v19, 1000000000)
v21 = add(v20, 55)

v120[5] = sub(v21, 3)
v22 = multiply(v120[6], 1000000)
v23 = sub(v22, 999975)
v120[6] = multiply(v23, 4)
v24 = add(v120[7], 55)

v25 = sub(v24, 33)
v26 = add(v25, 44)

v120[7] = sub(v26, 11)
v27 = multiply(v120[8], 10)
v28 = sub(v27, 5)
v29 = multiply(v28, 8)
v120[8] = add(v29, 9)
v30 = add(v120[9], 0)

v31 = sub(v30, 0)
v32 = add(v31, 11)

v33 = sub(v32, 11)
v120[9] = add(v33, 53)
v34 = add(v120[10], 49)

v35 = sub(v34, 2)
v36 = add(v35, 4)

v120[10] = sub(v36, 2)
v37 = multiply(v120[11], 1000000)
v38 = sub(v37, 999999)
v39 = multiply(v38, 4)
v120[11] = add(v39, 50)
v40 = add(v120[12], 1)
v41 = add(v40, 1)
v42 = add(v41, 1)
v43 = add(v42, 1)
v44 = add(v43, 1)
v45 = add(v44, 1)
v46 = add(v45, 10)
v120[12] = add(v46, 32)
v47 = multiply(v120[13], 10)
v48 = sub(v47, 5)
v49 = multiply(v48, 8)
v50 = add(v49, 9)
v120[13] = add(v50, 48)
v51 = sub(v120[14], 1)
v52 = multiply(v51, -294967296)
v53 = add(v52, 55)

v120[14] = sub(v53, 3)
v54 = add(v120[15], 1)
v55 = add(v54, 2)
v56 = add(v55, 3)
v57 = add(v56, 4)
v58 = add(v57, 5)
v59 = add(v58, 6)
v60 = add(v59, 7)
v120[15] = add(v60, 20)
v61 = multiply(v120[16], 10)
v62 = sub(v61, 5)
v63 = multiply(v62, 8)
v64 = add(v63, 9)
v120[16] = add(v64, 48)
v65 = add(v120[17], 7)
v66 = add(v65, 6)
v67 = add(v66, 5)
v68 = add(v67, 4)
v69 = add(v68, 3)
v70 = add(v69, 2)
v71 = add(v70, 1)
v120[17] = add(v71, 20)
v72 = add(v120[18], 7)
v73 = add(v72, 2)
v74 = add(v73, 4)
v75 = add(v74, 3)
v76 = add(v75, 6)
v77 = add(v76, 5)
v78 = add(v77, 1)
v120[18] = add(v78, 20)
v79 = multiply(v120[19], 1000000)
v80 = sub(v79, 999999)
v81 = multiply(v80, 4)
v82 = add(v81, 50)

v120[19] = sub(v82, 1)
v83 = sub(v120[20], 1)
v84 = multiply(v83, -294967296)
v85 = add(v84, 49)

v120[20] = sub(v85, 1)
v86 = sub(v120[21], 1)
v87 = multiply(v86, 1000000000)
v88 = add(v87, 54)

v89 = sub(v88, 1)
v90 = add(v89, 1000000000)

v120[21] = sub(v90, 1000000000)
v91 = add(v120[22], 49)

v92 = sub(v91, 1)
v93 = add(v92, 2)

v120[22] = sub(v93, 1)
v94 = multiply(v120[23], 10)
v95 = sub(v94, 5)
v96 = multiply(v95, 8)
v97 = add(v96, 9)
v120[23] = add(v97, 48)
v98 = add(v120[24], 1)
v99 = add(v98, 3)
v100 = add(v99, 3)
v101 = add(v100, 3)
v102 = add(v101, 6)
v103 = add(v102, 6)
v104 = add(v103, 6)
v120[24] = add(v104, 20)
v105 = add(v120[25], 55)
v106 = sub(v105, 33)
v107 = add(v106, 44)

v108 = sub(v107, 11)
v120[25] = add(v108, 42)
v120[26] = add(v120[26], v120[25])
v120[27] = add(v120[27], v120[12])
v109 = v120[27]
v110 = sub(v120[28], 1)
v111 = add(v110, v109)

v120[28] = sub(v111, 1)
v112 = v120[23]
v113 = sub(v120[29], 1)
v114 = multiply(v113, 1000000)
v120[29] = add(v114, v112)
v115 = v120[27]
v116 = add(v120[30], 1)

v116 = multiply(v116, v115)
v120[30] = v116

v120[31] = add(v120[31], v120[30])

flag = ''
for j in v120:
    flag += chr(j)

print 'CTF{' + flag + '}'

#CTF{daf8f4d816261a41a115052a1bc21ade}


发表评论:

Powered By Z-BlogPHP 1.5.2 Zero

Copyright www.liugongrui.com.All Rights Reserved.