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}