[网鼎杯 2020 青龙组]jocker
[网鼎杯 2020 青龙组]jocker
打开进入ida后按F5进行反汇编,发现存在堆栈不平衡的报错,这是由于call函数调用前后堆栈指针sp的值不同导致的,此时Option->General->Disassembly, 将选项Stack pointer打勾
此时进入汇编代码搜寻可能出现错误的地方,地址后面出现了一列数字,这表示当前堆栈指针的位置,此时我们发现在调用了encrypt函数之后,指针的位置发生变化
点击call那里,然后按alt+k修改堆栈指针指向的位置,将偏移量改为0
将下面同样的错误也更改掉
此时重新按F5就没有错误了
但是此时还是进不去encrypt和finally函数,而且可以看到这是一段数据,查资料得知是因为被加了壳,需要动态调试恢复源代码后才能继续分析,此时在判断处打上断点,开启动态调试
程序提示输入,此时我们随便输入24位即可,之后程序便会停在断点处 ,双击__Z7encryptPc在代码段找到该函数的部分,从定义一直到endp,还有下方的一片数据,全部选中之后按u取消定义,然后在定义头按p即可重新生成函数
然后再按F5即可成功得到脱壳后的encrypt函数
分析该算法得知只要将v2的值与Buffer的值异或即可得到正确的用户输入,解题脚本如下:
list1 = [0x0E, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x09, 0x00,
0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x56, 0x00,
0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x0C, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x1F, 0x00,
0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0x6B, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x59, 0x00,
0x00, 0x00, 0x0D, 0x00, 0x00, 0x00]
buffer = 'hahahaha_do_you_find_me?'
v2 = []
flag = ''
for i in range(len(list1)):
if i%4 == 0:
v2.append(list1[i])
for i in range(19):
flag += chr(v2[i] ^ ord(buffer[i]))
print(flag)
此时发现得出的flag不完整,只有19位,而题目要求用户的输入为24位,所以该题还没有结束
这时想起还有最后一个finally函数没有分析,我们用上面相同的方法得到finally函数
分析该算法发现无从得出最终的flag,此时推测就是将v3的值与某个固定的值进行异或可以得到,而用户的输入最后一个值一定是'}',因此用'}'与':'异或即可得到该固定的值,进而可以得出完整的flag,完整解题脚本如下:
list1 = [0x0E, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x09, 0x00,
0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x56, 0x00,
0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x0C, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x1F, 0x00,
0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0x6B, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x59, 0x00,
0x00, 0x00, 0x0D, 0x00, 0x00, 0x00]
buffer = 'hahahaha_do_you_find_me?'
v2 = []
flag = ''
for i in range(len(list1)):
if i%4 == 0:
v2.append(list1[i])
for i in range(19):
flag += chr(v2[i] ^ ord(buffer[i]))
v3 = '%tp&:'
key_value = ord('}') ^ ord(':')
for i in range(len(v3)):
flag += chr(ord(v3[i]) ^ key_value)
print(flag)
将得到的flag提交后发现成功了
因此本题的flag为:
flag{d07abccf8a410cb37a}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效