2020 第五空间大赛--RE题解

2020 第五空间大赛–RE题解

ManageCode

net+MFC的逆向,od好像没法调试(刚载入就运行了,哪个师傅会od调试请教教我)
dnspy载入,搜索字符串定位主函数
2020 第五空间大赛--RE题解_第1张图片
随后可以打断点调试,跟进if里面的check函数可以找到这里
长度以及格式的验证
2020 第五空间大赛--RE题解_第2张图片
FormChk返回后定位到这里
在这里插入图片描述
这里有一个chk_344函数,但无法跟进去,双击后找到这个函数
我们需要找到这两个号函数的偏移
2020 第五空间大赛--RE题解_第3张图片
在这里插入图片描述
随后我们选择用ida载入这个程序,选择第二个以普通pe文件解析
然后找到对应的地址之后就可以f5查看函数逻辑了
加密流程为先转hex然后方程验证
方程当然是z3直接跑(昨天赶时间直接复制的ida伪代码orz,脚本很丑)

from z3 import*
s=Solver()
flag=[Real(('x%d'%i)) for i in range(16)]
a1=flag

v2 = a1[0]
v33 =a1[0]
v3 = a1[2]
v31 = a1[2]
s.add( -307337 * v2 == -29811689 )

v4 = a1[1]
v32 = a1[1]

s.add(31219 * v2 - 470462 * v4 == -7321921)

v5 = 282799 * v4
v6 = a1[3]
v30 = a1[3]
s.add( v5 + 145509 * v3 - 299180 * v33 == 13723877 )


s.add( 475769 * v6 - 175678 * v32 - 389730 * v3 - 482630 * v33 == -95216128 )

v29 = a1[4]
s.add( -491556 * v33 - 36988 * v29 + 107882 * v32 + -208516 * v6 - 340530 * v3 == -159608574 )

v8 = a1[5]
v27 = v8
s.add( 115318 * v8 + 467004 * v33 + 110069 * v29 + 82828 * v31 - 14270 * v32 - 303753 * v6 == 59922906 )

v9 = a1[6]
v28 = v9
s.add( -279354 * v8 - 301605 * v30 + 336041 * v33 + 45022 * v31 + 111726 * v32 - 146340 * v29 - 237939 * v9 == -82351664 )

v10 = a1[7]
v26 = v10
s.add( -147932 * v29 - 23111 * v27 + 356418 * v30 + 157129 * v9 + 96850 * v31 + 459807 * v10 + -239175 * v33 - 15611 * v32 == 54529836 )

v11 = a1[8]
v25 = v11
s.add( -288572 * v10 - 452860 * v11 - 281026 * v31 + 459847 * v29 + 105871 * v32 + 363927 * v28 + 107668 * v33 + 305746 * v27 + 474305 * v30 == 94077867 )

v12 = a1[9]
v24 = a1[9]

s.add( 24450 * v32 + 318367 * v27 + 131436 * v33 + 163730 * v31 + 68350 * v30 + -200364 * v12 - 367700 * v26 - 298737 * v11 - 26977 * v28 - 411916 * v29 == -20388052 )


v15 = a1[10]
v23 = v15
s.add( 23830 * v31 + 389775 * v26 + 301398 * v32 + 367177 * v27 + 311452 * v30 - 434957 * v12 - 136393 * v15 - 172925 * v25 - 146025 * v33 - 493051 * v28 - 130882 * v29 == -88920064 )

v16 = a1[11]
v22 = v16
s.add( -427662 * v33 - 98903 * v29 - 17320 * v15 - 218483 * v32 - 85741 * v30 + 363857 * v26 + 163521 * v16 + 304649 * v27 + -43728 * v25 - 181088 * v31 + 173715 * v24 + 14457 * v28 == -61620324 )

v17 = a1[12]
v21 = v17
s.add( -195542 * v27 - 498833 * v32 - 412336 * v24 - 216657 * v29 - 501433 * v16 + 271173 * v31 + 74652 * v30 + 373303 * v28 - 306925 * v25 - 338825 * v26 - 475559 * v33 - 358450 * v17 - (v23 * 2**15) == -174934821 )
v18 = a1[13]
s.add( 110210 * v22 + -351890 * v31 - 184149 * v24 - 437072 * v17 + 324022 * v28 + 357830 * v25 + 162554 * v26 + 369921 * v32 + 142164 * v29 + 136219 * v23 + 49387 * v33 - 323429 * v18 - 198716 * v30 - 411630 * v27 == -124829042 )

v19 = a1[14]
s.add( 473866 * v23 + -257967 * v32 - 222834 * v26 - 118361 * v25 + 426304 * v33 + 507378 * v19 + 362998 * v21 - 342754 * v27 - 266674 * v24 - 61369 * v18 - 267106 * v29 - 388543 * v22 - 97045 * v28 - 229602 * v31 - 84816 * v30 == 78977681 )

s.add( 402402 * v23 + 477363 * v29 + 447356 * v27 + 46659 * v22 + -89442 * v25 - 455802 * v28 - 290697 * v33 - 108648 * v18 + 279039 * v19 + 520878 * v24 + 335538 * v32 + 310844 * v31 + 110817 * v26 - 433259 * a1[15] - 525875 * v21 - 2295 * v30 == 80694627 )


if s.check()==sat:
    print "sat"
    print s.model()
    model = s.model()
    str = []
    for i in range(16):
        str.append(model[flag[i]].as_long())
    print str
else:
    print "un"
#6116fb-709467-bb138c-02e28de9c5c510

解出来再转为hex拼接起来然后加上-就ok了

Rev

angr一把梭

import angr
import time
import claripy

def main():
    p=angr.Project("./rev_v2")

    flag=claripy.BVS('flag',100*8)
    initial_state=p.factory.entry_state(args=["./rev_v2",flag])
    sm=p.factory.simulation_manager(initial_state)

    sm.explore(find=0x400481)
    
    found=sm.found[0]
    solution=found.solver.eval(flag,cast_to=bytes)
    solution=solution[:solution.find(b'\x00')]

    return solution

if __name__ == '__main__':
    before=time.time()
    print (main())
    after=time.time()
    print("Time elapsed: {}".format(after - before))
#ctf{ropchain_is_g00d}

你可能感兴趣的:(CTF-RE)