IDA打开
shift+F12查看可疑字符串
双击OK, it's flag:
进入get_flag函数 F5查看伪c代码
慢慢搓代码
memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。
strcat 是 C 语言标准库中的一个字符串拼接函数,它用于将一个字符串(source)拼接到另一个字符串(destination)的末尾。该函数定义在 `<string.h>` 头文件中。
s的值是由f1和f2拼接而成的
查看f1的值
f2为空值 看接下来的代码 case4的作用是将f2赋值 这里看了其他大佬的wp 学到了一个新的知识 即大小端存储
大端存储,是将数据的低位字节放到高地址处,高位字节放到低地址处。
小端存储,是将数据的低位字节放到低地址处,高位字节放到高地址处。
这篇博客有更详细的介绍
https://blog.csdn.net/2401_84976395/article/details/138985113
根据以上知识 s的存储方式是小端存储 选中字符串按shift+E可以查看16进制 以此来判断是什么存储 由低地址到高低址 所以s是小端存储
s字符逆序存放得到正确的s
s=[0x69,0x63,0x75,0x67,0x60,0x6f,0x66,0x7f]
编写脚本
flag='GXY{do_not_'
s=[0x69,0x63,0x75,0x67,0x60,0x6f,0x66,0x7f]
a=''
for j in range(8): #循环
if j % 2 == 1:
a=chr(int(s[j])-2)
else:
a = chr(int(s[j]) - 1)
flag+=a
print(flag)
得到flag
flag{do_not_hate_me}