SinnerDusk 发表于 2020-3-17 18:54

菜鸡的比赛之旅--xctf高校战疫--cycle_graph

看了一下XCTF的高校公益赛,崩溃的感觉,两天把分析了两道题但是另外一道那道天津垓做到一半,实在是做不下去了只做到了最开始的那个Caucasus@s_ability后面的就没再分析了,还是太菜了。
后面再看WP后的时候有的大佬直接OD调试出的第一个,我是脚本写的。{:17_1084:}浪费了太多的时间最后还没耐心了。cycle_graph这道题也是看了好久,还是分析的比较少,最开始走了一点弯路,后来才发现了。
接下来还是拖进IDA分析(现在也发现自己的OD调试的能力好像更差)

经过观察选择先跟进dword_402178中以及后续的一些数据如下图:

在这个地方我疯狂“栽跟头”,为啥呢,注意看这里:

我最开始没有在意,但是分析到后面数据的个数总是对不上,我计算了多次这三个数组的地址。最后发现了这个因此又重新改写了脚本中每个数组的开头的数值
并且在这里还要注意char类型不要忽略了。另外v7也是char类型的。
而且确信它的源代码一定是这样的:

代码整体分析起来也不是十分难,但是我还是花掉了好长时间。


下面是代码的第一部分:

a=
b=
c=
x=[]
for i in range(0,32):
    v3=a
    x.append(v3)
    v4=3*b         #这里本来应该是先*12再除以4的,我直接换成*3了
    x.append(v4)
    v5=3*c         #这里本来应该是先*12再除以4的,我直接换成*3了
    x.append(v5)
print(x)
求得x数组中的值:


接着计算第二部分:
def find_path(graph,start,end,path=[]):
    path = path +
    if start == end:
      return

    paths = []
    for node in graph:
      if node not in path:
            newpaths = find_path(graph,node,end,path)
            for newpath in newpaths:
                paths.append(newpath)
    return paths
graph={}
for i in range(len(x)):
    if i % 3 == 0:
      graph = []
    else:
      graph.append(x)
allpath = find_path(graph,0,93)
for i in range(16):
    if len(allpath)==16:
      print(allpath)
用这一部分算出路径,因为它是循环十六次所以要寻找到路径长度为16的
得到这条路径。
最后一部分出flag:
v7=48
v4=0
flag = *16
p =
for i in range(16):
    if x == p:
      flag = v7 + x
      v4 = x
    elif x == p:
      flag = v7 - x
      v4 = x
    v7 = flag
print("".join(chr(i) for i in flag))

这里还要注意的一点就是从6开始到93再这样总共才15个还需要再向后走一个,再走一个还是93。这里可以把第二部分中的graph打印出来看一下。
应该是这个:
{0: , 3: , 6: , 9: , 12: , 15: , 18: , 21: , 24: , 27: , 30: , 33: , 36: , 39: , 42: , 45: , 48: , 51: , 54: , 57: , 60: , 63: , 66: , 69: , 72: , 75: , 78: , 81: , 84: , 87: , 90: , 93: }
最后的flag就不写了,有兴趣的可以自己去试一下。下边有文件链接。

Ginobili 发表于 2020-9-21 14:38

Dyingchen 发表于 2020-3-17 19:26
帮顶,这道题通过分析汇编发现其实只需要盯着eax和esi就能一位一位的得到flag了,因为我们输入进去的假码是 ...

如果只是跟随的话会遇到分支的吧。。。

多喝咖啡 发表于 2020-3-21 17:04

emmm做这题的时候看到一堆数据 不会分析 一脸懵逼,后面发现可以直接跟踪eax esi的值 得到flag 但是又不甘心这么简单的就得出答案。
参照楼主的思路试着再分析一下
学习了!

dakjwx2014 发表于 2020-3-17 19:21

谢谢分享,支持一下

Dyingchen 发表于 2020-3-17 19:26

本帖最后由 Dyingchen 于 2020-3-18 12:08 编辑

帮顶,这道题通过分析汇编发现其实只需要盯着eax和esi就能一位一位的得到flag了,因为我们输入进去的假码是没有经过加密的,所以精力放在分析对比的汇编代码即可

卫国 发表于 2020-3-17 21:33

感谢楼主分享,烧脑哦

rwi2013 发表于 2020-3-17 21:47

感谢分享,学习了

编程破解员 发表于 2020-3-17 22:16

感谢楼主分享学习了

q2838254 发表于 2020-3-17 22:38

拖进IDA分析

叶霸霸 发表于 2020-3-17 22:59

可以的哦

风雨辰 发表于 2020-3-18 03:56

感谢楼主分享,新手来学习一下

Parkourr 发表于 2020-3-18 07:58

感谢大佬分享
页: [1] 2
查看完整版本: 菜鸡的比赛之旅--xctf高校战疫--cycle_graph