Geek-10h-re-wp

geek-10h—wp-re

这是Syclover组办的成信校内面向新生的geek大赛,很开心参与进感受到了这些题目的强大,也学到了好多好多,
往后会更新这一篇,因为已经看到了大佬们完全逆向的做法,我的这个题解还是有些连蒙带猜的元素,利用flag格式这样的做题技巧,等完成了其他方式的复现就整理更新。
题目分享链接:
⬇⬇⬇⬇
链接:https://pan.baidu.com/s/1BLjMdm9yVTPiYH-h-1r16A
提取码:0uqp
复制这段内容后打开百度网盘手机App,操作更方便哦

hello

放入ida中,发现main函数中是铭文比较,查看字符串shift+f12
然后就查找到了flag
在这里插入图片描述

2333

载入ida,看到main函数的关键位置
在这里插入图片描述
其中base是加密函数,然后生成的字符串和cipher进行比较。base函数如下示:
在这里插入图片描述
其中我们看到a1[v4]&0xf和 a1[v4]>>4,这两个运算分别是取字符的前4位和后4位,我们知道若将C按此方式分别储存前四位在A和后四位在B中,只需要A*16+B即可复原。
由此写出脚本,运行得到flag:

 v6 = 0x3736353433323130
 a2 = '5379637B6E30775F794F755F6B6E6F775F6234736531367D'
 q = 0
 h = 0
 c = 0
 for i in range(0,len(a2),2):
     q = (int(a2[i],16) - v6) & 0xf
     h = (int(a2[i+1], 16) - v6) & 0xf
     c = q *16 + h 
     print(chr(c),end='')
     
 #Syc{n0w_yOu_know_b4se16}

Easy VB

这是一个vb编写的文件,使用ida打开会很混乱。
我们使用vb工具:vb decompiler
生成的代码已经具备了部分可读性,我们进行分析。
可以观察到几个关键位置:
(顺序是自下而上观察到的

  • loc_004023EF: Label2.Caption = “Sorry,you can try again.”
  • loc_004023C9: Label2.Caption = “Congratulation!You key word is true!”
  • loc_004023AC: If (var_74 <> “bKPObQ@goYBGRXjtVKVSn^@kFQh[V_]O”) <> 0 Then GoTo loc_004023D4
  • loc_00402355: var_74 = var_74 + Chr(CLng(var_54))
  • loc_004022BD: var_54 = CStr(Asc(ecx+esi*4) xor eax)
  • loc_0040213D: var_58 = “12345a789012345678g012345a789012”
    然后我们得到两个字符串和一个异或关系,尝试写脚本运行,得到了flag:
 a = "12345a789012345678g012345a789012"
 b = "bKPObQ@goYBGRXjtVKVSn^@kFQh[V_]O"
 for i in range(len(a)):
     print(chr(ord(a[i]) ^ ord(b[i])),end='')
    
 #Syc{W0w_Visual_Bas1c_ls_s0_cool}

冰菓

(非动漫玩家表示有点懵)
一直点一直点这个提示(我也不知道是哪位师傅的老婆)
会说到某个神器,然后去下载,并使用其分析这个程序。
这个工具52破解爱盘是有的。
在这里插入图片描述
左侧有一个mainwindow,
在这里插入图片描述
打开后发现关键部分,然后出现了加密函数,进入:
在这里插入图片描述
根据程序逆向写出脚本即可:

a = [119,77,103,79,21,115,133,97,115,87,22,115,103,89,88,93,22,89,119,81]
 b = 0 
 for i in range(20):
     b = (a[i] - 13) ^ 57
     print(chr(b),end='')
     
 #Syc{1_Am_s0_curi0uS}

re_py

得到.pyc文件就相当于得到了python文件的源码,
只需要简单的反编译即可,一般我喜欢使用在线工具
然后得到.py文件,分析源码:

 print 'This is a maze.'
 print 'Python is so easy.'
 print 'Plz Input The Shortest Way:'
 maze = '###########S#@@@@@@##@#@####@##@#@@@@#@##@####@#@##@@@@@@#@#########@##E######@##@@@@@@@@###########'
 way = raw_input()
 len = len(way)
 p = 11
 for i in way:
     if i == '&':
         p -= 10
     if i == '$':
         p += 10
     if i == '6':
         p -= 1
     if i == '3':
         p += 1
     if maze[p] == '#':
         print 'Your way is wrong'
         exit(0)
         break
     if maze[p] == '@':
         continue
     if maze[p] == 'E':
         print 'You do it,your flag is Syc\\{+Your Input+\\}.'
         exit(0)
 print 'May be something wrong.'

然后审查发现这是个地图题,其中四个字符表示上下左右,其中还可以看出迷宫宽度为10,然后#为墙,@是路,E是成功。
然后我们将地图打印下来,

 >>> maze = '###########S#@@@@@@##@#@####@##@#@@@@#@##@####@#@##@@@@@@#@#########@##E######@##@@@@@@@@###########'>>> for i in range(0,len(maze),10):
    print(maze[i:i+10])##########
#S#@@@@@@#
#@#@####@#
#@#@@@@#@#
#@####@#@#
#@@@@@@#@#
########@#
#E######@#
#@@@@@@@@#
##########

然后我们已经知道了路径,继续审查代码,和10相关会是上下,其中加为下,减为下,然后和1相关为左右,加为右,减为左。
于是得到flag。

dll_reverse

将exe文件载入ida中,发现主函数是将附赠的dll文件导入,然后调用了其中的TRicMx1r函数来判定输入的值的正确性。
在这里插入图片描述
将dll文件载入ida。分析关键函数:
在这里插入图片描述
然后我们观察关键函数:
在这里插入图片描述
前面部分为base64加密过程,且可以看到这是一个变表的base64:
在这里插入图片描述
后半部分为,数组间进行异或运算,并最终和另一数组进行比较:
在这里插入图片描述
我们使用ida内置python脚本打印出两个数组,并求得v14,但我们随即发现,v14并没有在arr3010中。这里思路断了,然后尝试动调,来观察下具体的运行。
我们使用动态调试,直接在异或位置下断,然后观察其中的值,就会发现,每次进行异或的v14其实就是加密以后的字符串,所以我们就可以直接写出脚本得到v14,这就是加密后的密文,然后转化为原表,在使用base64解密:

from base64 import *
 diy_base = 'ABCDEFGHIJKLMNOPQSVXZRWYTUeadbcfghijklmnopqrstuvwxyz0123456789+/'
 base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
 arr3010 = [69, 106, 67, 52, 86, 59, 79, 103, 71, 67, 25, 35, 67, 117, 108, 103, 59, 101, 84, 70, 66, 55, 1, 80, 85, 96, 73, 36, 24, 74, 39, 31, 9, 29, 74, 0]
 arr3034 = [34, 89, 50, 94, 56, 11, 66, 86, 38, 112, 77, 69, 19, 34, 45, 29, 91, 55, 112, 3, 18, 96, 124, 54, 7, 83, 3, 83, 79, 120, 86, 38]
 v14 = 0
 v15 = 0
 s = ''
 flag = ''
 for i in range(32):
     v15 = arr3034[i]if i % 2:
         v14 = v15 ^ arr3010[i]
     else:
         v14 = (v15 - 3) ^ arr3010[i]
 ​
     s = chr(v14)
     flag += base[diy_base.find(s)]
 print (flag.decode("base64"))
 ​
 ​
 #Syc{Just_Easy_D1l_Cr0ck}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值