下载发现是一个含有upx壳的文件

直接脱掉就好了,用upx工具

然后用IDA打开

一下子就找到了位置

image-20230607233345212

大概看一下就知道:

1
qmemcpy(v4, "*F'\"N,\"(I?+@", sizeof(v4));

这个是在v4里面拷贝字符串

然后下面用v4中的字符串 要和 _data_start _ 这个数组中通过v5+i-1的值来相等

通过经验可得到找到的这个v5+i-1的值应该就是我们的flag

image-20230607233612118

点过去就知道这个数组中的值

现在就是要逆向这串代码

1
( v4[i] != _data_start__[*((char *)v5 + i) - 1] )// 要相等

仔细看 *((char *)v5 + i) == v5[i]

1
2
3
4
5
_data_start__[*((char *)v5 + i) - 1] == _data_start__[v5[i] - 1]
也就是说
v4[i]的值要和_data_start__[v5[i]-1]的值一样
这个v5[i]-1 是一个索引值
这个v5才是flag

总体来说,这个表达式的含义是:将 v5 强制转换为 char 类型指针,并根据偏移量 i 获取指定偏移位置的值,然后将其减去 1,最后使用该值作为索引,访问 _data_start_ 数组中的元素。

v4 = [42, 70, 39, 34, 78, 44, 34, 40, 73, 63, 43, 64]

1
2
3
4
5
6
7
8
9
key = '~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$# !"' #'一定要加\
v4 = [42, 70, 39, 34, 78, 44, 34, 40, 73, 63, 43, 64]
v5 = []
flag=''
for i in v4:
v5.append(key.find(chr(i))+1)
for i in v5:
flag += chr(i)
print(flag)
1
2
3
4
5
6
7
8
9
10
v4 = [42,70,39,34,78,44,34,40,73,63,43,64]
s = ''
flag = ''
__data_strart__ = '~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$# !"'
for i in v4:
s += chr(__data_strart__.find(chr(i))+1)
print(s)
————————————————
版权声明:本文为CSDN博主「逆向萌新」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_71081503/article/details/125244750

flag{U9X_1S_W6@T?}