2021红名谷杯-g0.exe

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}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值