[2019红帽杯]easyRE 1

直接上IDA,在函数中找不到main函数,shift+12看看字符串有没有什么蛛丝马迹。

这里有几个关键的地方。第一条短红线应该就是主程序运行到flag的地方。第二条大伙就很熟悉了,是base64加密的原表。

这里先点You found me进去看看

然后ctrl+x 和 f5看看代码。

这里代码看的很乱,按照自己的思路重命名一下。这里有一个小技巧memset下面一搬跟着read和scanf函数,顾sub_4406E0这个函数很可能是read和scanf,下面先改名成为read。sub_424BA0这里呢多次出现在if判断语句里面还与数字进行判断,我觉得是计算字符串长度的strlen函数。

笔者对v12[12]=127和v13[3]=127和0LL这里的分别按r再撤销一次。

这里就可以开始阅读分析代码了。

这里应该是个比较函数,比较v11和off_6cc090的值。v11=sub_400E44(v10)我们先去看看sub_400E44是什么东西

感觉像是base64编码的样子,继续点aAbcdefghijklmn进去看看

看到这里可以确定是base64编码了,现在点off_6CC090进去提取base64内容解码看看,这一段就是编码后的内容。Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJsbDNXa1pPVlUxV2NIcFhhMk0xVmpKS1NHVkdXbFpOYmtKVVZtcEtTMUl5VGtsaVJtUk9ZV3hhZVZadGVHdFRNVTVYVW01T2FGSnRVbGhhVjNoaFZWWmtWMXBFVWxSTmJFcElWbTAxVDJGV1NuTlhia0pXWWxob1dGUnJXbXRXTVZaeVdrWm9hVlpyV1hwV1IzaGhXVmRHVjFOdVVsWmlhMHBZV1ZSR1lWZEdVbFZTYlhSWFRWWndNRlZ0TVc5VWJGcFZWbXR3VjJKSFVYZFdha1pXWlZaT2NtRkhhRk5pVjJoWVYxZDBhMVV3TlhOalJscFlZbGhTY1ZsclduZGxiR1J5VmxSR1ZXSlZjRWhaTUZKaFZqSktWVkZZYUZkV1JWcFlWV3BHYTFkWFRrZFRiV3hvVFVoQ1dsWXhaRFJpTWtsM1RVaG9hbEpYYUhOVmJUVkRZekZhY1ZKcmRGTk5Wa3A2VjJ0U1ExWlhTbFpqUldoYVRVWndkbFpxUmtwbGJVWklZVVprYUdFeGNHOVhXSEJIWkRGS2RGSnJhR2hTYXpWdlZGVm9RMlJzV25STldHUlZUVlpXTlZadE5VOVdiVXBJVld4c1dtSllUWGhXTUZwell6RmFkRkpzVWxOaVNFSktWa1phVTFFeFduUlRhMlJxVWxad1YxWnRlRXRXTVZaSFVsUnNVVlZVTURrPQ==

进行多次解码。解码结果https://bbs.pediy.com/thread-254172.htm

进去网站看看,这里进了干扰项,得重头来过。

继续阅读代码看看。发现这部分代码挺可疑的。

于是向看看v13[i]^i的结果。编写exp,这里给了个屁话提示。想过离开~~~

然后,开始漫无目的在代码里面逛街,有函数就点进去看看。

最终发现!这里有可疑的字符串。

然后ctrl+x查看byte_6CC0A0

然后将102和103按r看看

f,g  这里就要想到flag,说明了这里很有可能是真正的关键函数。

这里先把代码的变量关系捋一捋。v1=v4,byte_6CC0A3和byte_6CC0A0其实是可以看做同一个数组里但是下角标不同。

接着看sub_410E90函数的内部构造

这里太复杂了。不管了,返回去分析他的代码。这里我把代码分为三部分。

第一部分,应该是个加密部分,将v1也就是v4加密。

第二部分就是判断部分,但是在这个判断部分呢,我们能找到出很多有用的信息。

由v1^byte_6CC0A0[0]='f'和HIBYTE(v4) ^ (unsigned __int8)byte_6CC0A3) == 'g'

这里补充一下HIBYTE(v4)是指V4的高位的值,由于V1=V4也就是V1高位的值。

这里我们就可以猜测出来

*v1^byte_6CC0A0[0]=v1^byte_6CC0A0=‘f’,*v4^byte_6CC0A0[3]=v4^byte_6CC0A3=‘g’

*v2^byte_6CC0A0[1]=v2^byte_6CC0A1=‘l’,*v3^byte_6CC0A0[2]=v3^byte_6CC0A2=‘a’

第三部分sub_410E90((unsigned __int8)(byte_6CC0A0[j] ^ *((_BYTE *)&v4 + j % 4)))我们主要看里面这部分(byte_6CC0A0[j] ^ *((_BYTE *)&v4 + j % 4))

这部分可以看出byte_6CC0A0[j] ^v4[j%4]

那我们如何求出这部分的值呢。要求这部分就要有byte_6CC0A0的数组内容和V4的数组值。

byte_6CC0A0的内容如下

shlft+e提取出16位数据。403520565D182245172F246E623C2754486C246E723C32455B

V4是一个数组看下面的计算v4的exp

最后编写整体的exp计算flag

def flag_result():
    str1 = "403520565D182245172F246E623C2754486C246E723C32455B"
    result = []
    test = ['f', 'l', 'a', 'g']
    flag = []

    for i in range(0, len(str1), 2):
        result.append('0x' + str1[i] + str1[i + 1])

    test1 = []
    for i in range(4):
        test1 += chr(ord(test[i]) ^ int(result[i], 16))
    print(test1)

    for i in range(25):
        flag += chr(int(result[i], 16) ^ ord(test1[i % 4]))

    print(''.join(flag))

['&', 'Y', 'A', '1']
flag{Act1ve_Defen5e_Test}

  • 34
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值