收到文件,.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加密。最后判断v11
与off_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}
拿下!