前言

本来写了好几个的(都挺简单的)但是上传失败了

好烦 就没再搞 然后的话又因为今天要期末考试

所以就找一篇我觉得有用的上传吧

Orz

[Zer0pts2020]easy strcmp

这题 挺新颖的

打开是个Linux的压缩包 放到虚拟机解压

拖出来 查壳

image-20230220170209187

然后运行一下

回显看不懂

image-20230220170238075

拖入ida64分析

奇怪了 啥也没调用

怎么整 不慌 随便翻翻看看

image-20230220170414375

翻一下左面函数栏

其实没有这么麻烦 了解函数调用的约定就能知道

为什么先调用init了由右向左传入

image-20230220170747797

image-20230220170555956

image-20230220170613038

发现先调用的init函数

跟进去看看

image-20230220170829173

这几个函数都看看 然后跟如889 发现了两个call

都看一下 发现795有用

image-20230220170852538

跟如795

image-20230220170931557

然后看到这个是 strcmp call

image-20230220171020993

这样就知道了 strcmp调用了6EA这个函数

那这个就是关键call了

image-20230220171250693

跟入6EA

image-20230220171411920

然后 应该就了解怎么回事了吧

image-20230220171450636

贴exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import binascii
cipher = 'zer0pts{********CENSORED********}'

encData = [0, 0x410A4335494A0942, 0x0B0EF2F50BE619F0, 0x4F0A3A064A35282B, 0]

flag = b"" # 由于是字节操作,需要在前面加上b
for i in range(5):
p = cipher[i * 8:(i + 1) * 8] # 将cipher字符串8位一组分开
print(p)
a = binascii.b2a_hex(p.encode('ascii')[::-1]) # 将分开后的字符串转每一位转换成ascii,然后逆序
print(a)
b = binascii.a2b_hex(hex(int(a, 16) + encData[i])[2:])[::-1] # (cipher[i]的ascii+encData[i])的结果是16进制,[2::]是舍弃开头的0x,然后[::-1]逆序
print(b)
print('\n')

flag += b # 拼凑每组还原后的结果

print(flag)

# zer0pts{l3ts_m4k3_4_DETOUR_t0d4y}

flag{l3ts_m4k3_4_DETOUR_t0d4y}

提交一下 过辣

总结

这道题挺难的 我学到了很多东西

哈哈哈 记录一下

然后 就没然后了

哥们去准备期末考试了

好烦 晚上就要考 还有3个小时

好的 本题结束 感谢观看

Orz