攻防世界RE_ereere

IDA32打开

审计:

发现没有主函数 shift+f12查找flag双击之后找到sub_400BC8()进入

发现是主函数 f5

输入了v3之后 先进行了sub_41A6E0(v3)处理

没有找到关键信息(咳咳没看懂) 继续跟进

发现又进行了 sub_4009DC(v3)处理

先调用了sub_400864()继续跟进

发现两个里面都是256的for循环,并且第一个只进行了赋值判断,第二个进行了取余操作还都是256的循环

可以推出为RC4加密 第一个为初始化 第二个为加密跟进aFlag1233213211发现

 aFlag1233213211[ ]值为flag{123321321123badbeef012}

回到主函数继续下一步跟进  sub_400550()

进去aZyxwvutsrqponm发现是base64加密  密码表不是默认的

回到主函数看15行

  if ( sub_41A1E0(v2, "ScDZC1cNDZaxnh/2eW1UdqaCiJ0ijRIExlvVEgP43rpxoxbYePBhpwHDPJ==") )

 得出 是将输入的v3的值先进行了RC4加密然后base64加密然后与v2进行比较相同则输出flag

思路:

(最先调用的sub_41A6E0(v3)应该是strlen()的作用 不重要)

将base64进行换表之后把

ScDZC1cNDZaxnh/2eW1UdqaCiJ0ijRIExlvVEgP43rpxoxbYePBhpwHDPJ==

进行base64解密 然后再进行RC4解密就能得到flag   

难点在于 要知道RC4加密和base64加密 

脚本:

flag{RC_f0ur_And_Base_s1xty_f0ur_Encrypt_!}

第一个(需要Crypto.Cipher (可以百度搜一下   或者用第二个脚本))

import base64
from Crypto.Cipher import ARC4

key = "ScDZC1cNDZaxnh/2eW1UdqaCiJ0ijRIExlvVEgP43rpxoxbYePBhpwHDPJ=="
string1 = "ZYXWVUTSRQPONMLKJIHGFEDCBAabcdefghijklmnopqrstuvwxyz/+9876543210"  # string1表示更换后的码表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"  # string2表示原始码表
Str = base64.b64decode(key.translate(str.maketrans(string1, string2)))  # Base64解密,bytes型

aFlag1233213211 = "flag{123321321123badbeef012}"
flag = ARC4.new(bytes(aFlag1233213211, encoding='utf-8')).decrypt(Str)
print(flag)

 第二个 (这个是手动RC4解密   呜呜呜太难了。。。。。。。。。。。。。。。。)

import base64

flag = ""
key = "ScDZC1cNDZaxnh/2eW1UdqaCiJ0ijRIExlvVEgP43rpxoxbYePBhpwHDPJ=="
string1 = "ZYXWVUTSRQPONMLKJIHGFEDCBAabcdefghijklmnopqrstuvwxyz/+9876543210"  # string1表示更换后的码表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"  # string2表示原始码表
print("Base64还原: ", key.translate(str.maketrans(string1, string2)))   # 将 key 还原成初始码表加密后的结果
Str = base64.b64decode(key.translate(str.maketrans(string1, string2)))  # Base64解密,bytes型
print("Base64解密: ", Str)

byte_4A0860 = []
aFlag1233213211 = "flag{123321321123badbeef012}"

# rc4_init
for i in range(256):
    byte_4A0860.append(i)
v4 = 0
v3 = 0
for j in range(256):
    v5 = byte_4A0860[j]
    v3 = (v5 + v3 + ord(aFlag1233213211[int(j % len(aFlag1233213211))])) & 0xff
    byte_4A0860[j] = byte_4A0860[v3]
    byte_4A0860[v3] = v5
    v4 = v4 + 1
    if v4 >= len(aFlag1233213211):
        v4 = 0

print("s_box:", end=" ")
for j in range(256):
    print(byte_4A0860[j], end=" ")
print()

# rc4_crypt
v4 = 0
v3 = 0
for k in range(len(Str)):
    v3 = (v3 + 1) & 0xff
    v4 = (byte_4A0860[v3] + v4) & 0xff
    v5 = byte_4A0860[v3]
    byte_4A0860[v3] = byte_4A0860[v4]
    byte_4A0860[v4] = v5
    flag += chr(Str[k] ^ byte_4A0860[(byte_4A0860[v3] + byte_4A0860[v4]) & 0xff])

print(flag)

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值