27.[2019红帽杯]easyRE1(保姆教程)

收到文件,.elf 文件,ExeinfoPE查看一下基础信息。无壳,64bit。

把文件拖入IDA工具,查看一下。

点击关键字,ctrl + x  交叉搜索一下位置,跟进,顺便菜单左侧 Edit --> Plugins--> findcrypt 确认一下加密方式,果然是base64加密,ok,稍微留意一下,我们继续跟进函数。

往上看,代码很长,我们仍然分为两部分,第一部分刚好到“continue”。

给了我们三串字母文本,同时第一,二个文本后强加了一个ACSll值,127,应该是空格。

刚好36位,和下面对应上了,我们跟进一下第一个函数 sub_4406E0,不知道你们怎么想,我是直接 { 玛卡巴卡······ }了,看不懂,而且还套着函数 ,先看下一个函数 sub_424BA0,嗯,更看不懂。。。不管了,(先加纳...),我们大胆猜测。

通过主程序,我们可以猜测,该函数的作用应该是读取我们的输入。同理,根据if语句中的v15[i] ^ i) != v12[i],我们也可以猜测函数sub_424BA0是读取长度的。

事实证明,我猜对了,虽然猜测但也要有依据。

行,我们写一个python脚本将加密的数据异或解密。

v12  = "Iodl>Qnb(ocy"
v13  = "y.i"
v14  = "d`3w}wek9{iy=~yL@EC"

v12 = list(v12)
for i in range(len(v12)):
    v12[i] = ord(v12[i])
v12.append(127)

v13 = list(v13)
for i in range(len(v13)):
    v13[i] = ord(v13[i])
v13.append(127)

v14 = list(v14)
for i in range(len(v14)):
    v14[i] = ord(v14[i])

v12.extend(v13)
v12.extend(v14)

print(v12)
v15=''
for i in range(0,len(v12)):
    v15+=chr(v12[i]^i)
print(v15)
#The first four chars are `flag`

嗯,解出来了,说前四个字符就是flag。这给我激动的直接去写答案了,啧,才第一部分,我真是在做梦。。。而且还没用到base64加密呢,这题目是越来越麻烦了

我们继续分析第二部分:

前面两个函数分析过了,跳了,重点看画框的,我们跟进一下。这里用了10次相同的函数,函数作用是base64加密。最后判断v11off_6cc090是否相等,我们双击off_6cc090查看其内容。

off_6cc090查看其内容,嗯,就是这个鬼样子,不管他,我们写脚本还原一下。

脚本如下:

import base64

# 原始base64编码的字符串
v11 = "Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJsbDNXa1pPVlUxV2NIcFhhMk0xVmpKS1NHVkdXbFpOYmtKVVZtcEtTMUl5VGtsaVJtUk9ZV3hhZVZadGVHdFRNVTVYVW01T2FGSnRVbGhhVjNoaFZWWmtWMXBFVWxSTmJFcElWbTAxVDJGV1NuTlhia0pXWWxob1dGUnJXbXRXTVZaeVdrWm9hVlpyV1hwV1IzaGhXVmRHVjFOdVVsWmlhMHBZV1ZSR1lWZEdVbFZTYlhSWFRWWndNRlZ0TVc5VWJGcFZWbXR3VjJKSFVYZFdha1pXWlZaT2NtRkhhRk5pVjJoWVYxZDBhMVV3TlhOalJscFlZbGhTY1ZsclduZGxiR1J5VmxSR1ZXSlZjRWhaTUZKaFZqSktWVkZZYUZkV1JWcFlWV3BHYTFkWFRrZFRiV3hvVFVoQ1dsWXhaRFJpTWtsM1RVaG9hbEpYYUhOVmJUVkRZekZhY1ZKcmRGTk5Wa3A2VjJ0U1ExWlhTbFpqUldoYVRVWndkbFpxUmtwbGJVWklZVVprYUdFeGNHOVhXSEJIWkRGS2RGSnJhR2hTYXpWdlZGVm9RMlJzV25STldHUlZUVlpXTlZadE5VOVdiVXBJVld4c1dtSllUWGhXTUZwell6RmFkRkpzVWxOaVNFSktWa1phVTFFeFduUlRhMlJxVWxad1YxWnRlRXRXTVZaSFVsUnNVVlZVTURrPQ=="

# 对字符串进行填充,使其长度为4的倍数
while len(v11) % 4 != 0:
    v11 += '='

# 解码过程
v10 = base64.b64decode(v11)
v9 = base64.b64decode(v10)
v8 = base64.b64decode(v9)
v7 = base64.b64decode(v8)
v6 = base64.b64decode(v7)
v5 = base64.b64decode(v6)
v4 = base64.b64decode(v5)
v3 = base64.b64decode(v4)
v2 = base64.b64decode(v3)
v18 = base64.b64decode(v2)

# 打印解码后的结果
print(v18)
#  b'https://bbs.pediy.com/thread-254172.htm'

b'https://bbs.pediy.com/thread-254172.htm'

我也是吐了,谁啊咋这么。。,忙活到现在和我说被耍了,吐血。。。

那你加密个锤子,哎,被立正了,也是学到了学到了

找其他突破口:

我不信,绝对在这附近,返回上一级,ok,找到可疑的地方了,还在这附近,哼哼哼,猛攻!!!

左边可以ctrl + x 交叉搜索字符进入F5,也可以直接从右边地址进入。

又是大串代码,有数字下意识就给 R 一下,找到了。看到f和g突然想到了falg,而这里正好f和g中间相差两个字符,就确定了是flag中的f,g。然后就能够通过异或拿到falg了。看脚本:

脚本如下:

string1 = [0x40,0x35,0x20,0x56,0x5D,0x18,0x22,0x45,0x17,0x2F,0x24,0x6E,0x62,0x3C,0x27,0x54,0x48,0x6C,0x24,0x6E,0x72,0x3C,0x32,0x45,0x5B]
key = ""
flag = ""
en = "flag"
for i in range(4):
    key+=chr(string1[i]^ord(en[i]))
print(key)
for j in range(len(string1)):
    flag+=chr(string1[j]^ord(key[j%4]))
print(flag)

flag{Act1ve_Defen5e_Test}

拿下!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值