BUUCTF-----easy_strcmp

1.拿到题目的文件

解压

得到一个名为chall的文件

进行查壳

收集信息,64位程序

2。拖入ida中

这就是主程序

大概的意思就是当a2=zer0pts{********CENSORED********}的时候就会输出Correct!

把这个字符串带回网站进行验证

发现是错误的

那么

真実は一つだ(真相只有一个)

这个题没有这么简单😎😎

3.我们来看这个题目中出现过的函数

看完每个函数里面的东西后,我们发现sub_6EA函数有很大的作案嫌疑😎(它对字符串进行了某种不可告人的处理)

 

我们跟进qword_201060数组,可以得到它的值

我们可以看出来,它对于这个数组进行储存的时候是小端序储存(大端序和小端序_Casuall的博客-CSDN博客_大端序和小端序的区别

所以在写脚本的时候,要注意进行倒序

我们马上对这个sub_6EA函数进行分析

好了,我们有后面数组的值了,还有相减后的值,即( zer0pts{********CENSORED********})

接下来,上脚本

一、难以理解的脚本

enc = "********CENSORED********"
m = [0x410A4335494A0942, 0x0B0EF2F50BE619F0, 0x4F0A3A064A35282B]

import binascii

flag = b''
for i in range(3):
    p = enc[i*8:(i+1)*8]
    a = binascii.b2a_hex(p.encode('ascii')[::-1])
    b = binascii.a2b_hex(hex(int(a,16) + m[i])[2:])[::-1]
    flag += b
print (flag)

 

得到flag{l3ts_m4k3_4_DETOUR_t0d4y}

带到网站进行验证

正确!!!!! 

二、比较容易理解的脚本

我们将 qword_201060数组里面的值转换为10进制

我们把********CENSORED********也转换为10进制

接下来就是依次相加(要注意有的字节大于127 是以补码形式存在的负数 需要另行还原)

其中为什么要把数组&0xff?

那是因为

byte类型的数字要&0xff再赋值给int类型,其本质原因就是想保持二进制补码的一致性。

byte为什么要与上0xff? - 陈其苗 - 博客园

a=[66, 9, 74, 73, 53, 67, 10, 65, 240, 25, 230, 11, 245, 242, 14, 11, 43, 40, 53, 74, 6, 58, 10, 79]
b=[42, 42, 42, 42, 42, 42, 42, 42, 67, 69, 78, 83, 79, 82, 69, 68, 42, 42, 42, 42, 42, 42, 42, 42]
f=''
for i in range(24):
    if a[i]<127:
        f+=chr(a[i]+b[i])
    else:
        f+=chr(b[i]-(((~(a[i]))&0xff)+1))
print(f)

最后得到一样的flag

带到网站,验证

正确!!!!!! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mov1A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值