2021红名谷杯-g0.exe
一:准备
检查发现是用go写的,载入装了GolangHelper的IDA7.5,结果发现解析不了,也恢复不了函数名
然后在网上乱逛的时候查找到发现说ida7.6的free版的可以看见反汇编,但是不能反编译
搞一个IDA7.6free的试试
果然恢复了函数名,也能看得了汇编
二:调试+汇编分析逻辑
记下main_main函数的地址,开始调试
得到长度为20,重新调试,这次输入0123456789abcdefghij这种长度为20的字符串
在encode函数前,将我们的输入进行了乱序:
0123456789abcdefghij
变成了如图所示的字符串:
然后跟进encode函数
encode函数中math_big_nat_setBytes执行后:43210edcbajihgf98765
这又是一次乱序
然后往下调试,发现了循环20次
每次
%58 作为下标取一个长度为58的字符串中的字符(这里就看出来是换表的base58)
最后逐渐跟进encode函数,并没有找到比较的数据,返回main函数继续跟进,最后在main的一个反调试(patch几个跳转就可以跳过)之后的函数main_main_func1中找到了比较的字符串
2GVdudkYo2CBXoQii7gfpkjTc4gT
三:脚本
# _*_ coding:utf-8 _*_
# @功能描述:
# @程序作者:SYJ
# @版权信息:Reversed By SYJ
# @版本信息:0.0.0
table = "12Nrst6CDquvG7BefghJKLMEFHPQZabRSTUVmyzno89ApwxWXYcdkij345"
def base58encode(n): # base58加密,传入的是ASCII码
result = ''
while n > 0:
result = table[n % 58] + result
n /= 58
return result
def base58decode(s): # 解密,传入的是加密后的字符串
result = 0
for c in s:
result = result * 58 + table.find(c)
return result
encode_string = "2GVdudkYo2CBXoQii7gfpkjTc4gT"
import binascii
print(binascii.unhexlify(hex(base58decode(encode_string))[2:]).decode(encoding="utf-8"))
# flag{We1CTFc0m_2345}