这个周末参加了一下美团高校CTF 和 DAS九月赛,也没做出来什么,tcltcl
美团 small
到手是个很小的elf,之前一直以为它加壳了,研究怎么dump,后来发现方向全错了,确实是很小的程序。。不过要直接看汇编
我太菜了,意识还是不够,看了好久都没看出来是TEA
Delta 是0x67452301,key是#, g, E,0x23=35轮
获得加密数据(截图不全:
然后写个TEA的脚本逆回去就行
DAS landing
首先查看input something的位置找到程序入口,只有一个异或,f5看不出什么,点开func1,一个简单base64,看后面的意思应该是假的,不管。
再次查看string窗口,找到“Good…please packed the flag…”,应该是真flag的位置,倒着往回看,这才是真正的加密部分:
前面可以看到载入的一大串字符,从汇编可以看出,先异或0x12再进入这个nothing函数:
点进nothing函数爆红,在call爆红的那句指令处按U, undefine即可恢复正常汇编
进去看就是base64,不过有点小陷阱就是base64转换后后移了一位:哦除了等号不变
理清思路以后就可以往回逆了,提取那串字符,异或0x12,每一位前移一位ascii码然后解base 64,不过还没完,现在回到input处看它的第一步操作,异或0x22然后自增1(比赛的时候没注意到自增1没做出来,属于是瞎了),脚本如下:
import base64
n =[0x47, 0x55, 0x77, 0x5C, 0x44,
0x7E, 0x55, 0x48, 0x47, 0x23,
0x6B, 0x59, 0x47, 0x7E, 0x7F,
0x42, 0x41, 0x23, 0x7B, 0x51,
0x4A, 0x54, 0x28, 0x5C, 0x41,
0x20, 0x7B, 0x42, 0x47, 0x7E,
0x24, 0x42, 0x47, 0x7E, 0x24,
0x42, 0x47, 0x7A, 0x2F, 0x2F]
f = ''
for i in n:
f += chr((i ^ 0x12)-1)
f = f[:-2] + '=='
f = base64.b64decode(f)
k = ''
for i in f:
k += chr((ord(i)-1) ^ 0x22)
print(k)
# DASCTF{itisbulijojodebuliduoooooooo}
在主函数中看不到真正加密部分的反汇编,而且由于这个catch机制,没法动态调试到主加密部分,不过可以用patcher
挑一个jmp指令,patch成直接跳转到主加密部分开始的地址
即可看到全部正常的主函数: