buuctf——[V&N2020 公开赛]strangeCpp && buuctf——[BJDCTF2020]easy && buuctf——[ACTF新生赛2020]usualCrypt

本文介绍了[V&N2020 公开赛]strangeCpp,通过分析找到flag的解密过程;[BJDCTF2020]easy中利用调试技巧获取flag;以及[ACTF新生赛2020]usualCrypt的加密验证模型,详细解析了解密流程。

[V&N2020 公开赛]strangeCpp

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

交叉引用,看伪c,应该是mian函数
在这里插入图片描述
24-31输出了字符串
在这里插入图片描述

welcome,应该就是这里了。。多了byte_140021008
在这里插入图片描述
就这个函数,看到putchar函数里面有刚刚看见的字符串,有flag那味儿了。
从尾开始搞,打印的肯定是flag了,就是dword_140021190这一段和刚刚找到的字符串逐个异或,然后就是找dword_140021190这一段是啥了
在这里插入图片描述
这里应该是对dword_140021190进行了操作的,进去看看sub_140011384
在这里插入图片描述
由最初的值经过位移和乘法得到了dword_140021190的最终值,但是我们并不知道最初的值。
也就是说经过一个函数处理dword_140021190返回值等于607052314,同时这个数又小于14549743(也就是之前那个函数中的第21行if语句对dword_140021190的限制)
不知道最初的数据,就爆破吧


v8=0
for i in range(14549743):
    tmp=(((i<<8)^(i>>12))*291)&0xffffffff
    if tmp==607052314:
        v8=i
        break

a=[0x26, 0x2C, 0x21, 0x27, 0x3B, 0x0D, 0x04, 0x75, 0x68, 0x34,
  0x28, 0x25, 0x0E, 0x35, 0x2D, 0x69, 0x3D, 0x6F, 0x6D, 0x00]
print(v8)
for j in range(17):
    print(chr((v8^a[j])&0xff),end="")
    

在这里插入图片描述
MD5解密,加上题目中说的是flag中没有大写字母,所以知道是小写。
在这里插入图片描述
flag{e10adc3949ba59abbe56e057f20f883e}
(&0xffffffff和&0xff学到了,开始没有加这个东西怎么跑都跑不出来,后来才知道是v8和flag溢出了,必须对变量进行限制,0xFFFFFFF是最大32个字节,0xFF是最大8个字节)

[BJDCTF2020]easy

在这里插入图片描述
main函数中什么都没有
找到ques()函数就是输出我们的flag
在这里插入图片描述
我们可以通过调试修改EIP的地址到ques函数(0x00401520)从而输出flag。
在这里插入图片描述

在这里插入图片描述
flag{HACKIT4FUN}

[ACTF新生赛2020]usualCrypt

在这里插入图片描述
main函数
在这里插入图片描述
12 和 26 行的sub_403CF8显然是输出函数,21 - 25 行的while()是字符串比较的过程,看来还是一个输入 flag 加密验证正确性的模型。

发现19行的sub_401080是加密函数,进入分析
在这里插入图片描述
主体的代码是base64加密算法,但在加密前执行了sub_401000(),这是一个改变密钥对应表的函数
在这里插入图片描述
byte_40E0A0和byte_40E0AA看起来是两个数组,其实都是一个字符串上(即密钥表串)的地址,

所以这个子函数的功能就是把一个字符串上的范围内的字符按偏移索引(result)两两交换

在操作后,base64 的加密规则未变,但是部分字符的意义发生了变化

在写逆向脚本代码的时候可以用 python 的字典构造原密钥与改过的密钥的对应关系

在加密后,该函数又调用了sub_401030
在这里插入图片描述

这个子函数把字符串每个英文字符进行了大小写转换,最后形成数据段保存的密码byte_40E0E4。

该程序进行了多重加密,在取出密码之后首先要进行大小写转换,令其出于 base64(更改密钥表后)加密后的形态

第二步是还原经 base64(更改密钥表后)加密字符的原含义,还原规则即sub_401000()的交换

最后得到了真实的nbase64n加密字符串,解密即可得到flag

脚本如下

import base64

flag = ''; dict = {}; offset = 10
orgin = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for i in range(len(orgin)):
    dict[orgin[i]] = orgin[i]
for i in range(6, 15): #sub_401000()
    dict[orgin[i]] , dict[orgin[i+offset]] = dict[orgin[i+offset]] , dict[orgin[i]] # 恢复base64密钥表
secret = 'zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9'.swapcase() #sub_401030()
for i in range(len(secret)):
    flag += dict[secret[i]] 
flag = base64.b64decode(flag)
print(flag)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值