终于找到远程动调 ELF 失败的原因了,补一下之前的题目
64 位 ELF,载入 IDA,查看主函数
mprotect 是一种保护函数,不做重点分析,观察到 sub_402219 函数既作为数据参与异或,又作为函数来引用,猜测异或完后,这个函数才是它真正的样子,所以找到这段函数的地址
看到一大坨数据,使用 IDC 脚本还原数据
运行完后得到
全选数据按 C 将数据转化为代码,然后全选代码按 P 生成函数,F5 反编译
大概就是将 unk_603170 作为密钥加密输入内容然后与 byte_6030A0 比较,而 byte_6030A0 已知
所以接下来知道 unk_603170 就可以解出 flag 了,看到之前主函数里的 sub_40207B 函数
看到加密的函数(这里我已经重命名为 md5_encrypt 了),能看到很明显四个特征值,所以可以大体确定为 MD5 加密
因为不是很清楚这些加密函数都对要求的数值造成了什么影响,也懒得推导,所以就采取了动调的方式获取到 unk_603170 的值,得到
所以总结一下就是
加密后的内容为
BC0AADC0147C5ECCE0B140BC9C51D52B46B2B9434DE5324BAD7FB4B39CDB4B5B
密钥为
CB8D493521B47A4CC1AE7E62229266CE
写脚本得到 flag
from Crypto.Cipher import AES
from Crypto.Util.number import *
key = long_to_bytes(0xcb8d493521b47a4cc1ae7e62229266ce)
mi = long_to_bytes(0xbc0aadc0147c5ecce0b140bc9c51d52b46b2b9434de5324bad7fb4b39cdb4b5b)
lun = AES.new(key, mode=AES.MODE_ECB)
flag = lun.decrypt(mi)
print(flag)
#flag{924a9ab2163d390410d0a1f670}