[网鼎杯 2020 青龙组]jocker

发布时间 2023-07-03 10:24:44作者: h40vv3n

[网鼎杯 2020 青龙组]jocker

打开进入ida后按F5进行反汇编,发现存在堆栈不平衡的报错,这是由于call函数调用前后堆栈指针sp的值不同导致的,此时Option->General->Disassembly, 将选项Stack pointer打勾

image-20230627095332167

此时进入汇编代码搜寻可能出现错误的地方,地址后面出现了一列数字,这表示当前堆栈指针的位置,此时我们发现在调用了encrypt函数之后,指针的位置发生变化

image-20230627095928955

点击call那里,然后按alt+k修改堆栈指针指向的位置,将偏移量改为0

image-20230627100142890

将下面同样的错误也更改掉

image-20230627100248569

image-20230627101956638

此时重新按F5就没有错误了

image-20230627102125513

但是此时还是进不去encrypt和finally函数,而且可以看到这是一段数据,查资料得知是因为被加了壳,需要动态调试恢复源代码后才能继续分析,此时在判断处打上断点,开启动态调试

image-20230627103839841

程序提示输入,此时我们随便输入24位即可,之后程序便会停在断点处 ,双击__Z7encryptPc在代码段找到该函数的部分,从定义一直到endp,还有下方的一片数据,全部选中之后按u取消定义,然后在定义头按p即可重新生成函数

image-20230627104323199

image-20230627104333694

然后再按F5即可成功得到脱壳后的encrypt函数

image-20230627104517693

分析该算法得知只要将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位,所以该题还没有结束

image-20230627105409876

这时想起还有最后一个finally函数没有分析,我们用上面相同的方法得到finally函数

image-20230627105652298

分析该算法发现无从得出最终的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提交后发现成功了

image-20230627110749077

因此本题的flag为:

flag{d07abccf8a410cb37a}