首页
论坛
课程
招聘
[原创]2019看雪CTF晋级赛Q1-第五题writeup
2019-3-17 01:35 1304

[原创]2019看雪CTF晋级赛Q1-第五题writeup

2019-3-17 01:35
1304

观察

题目描述为考查密码学知识,猜测题目可能包含一些密码算法。用PEiD的插件Krypto ANALyzer扫描程序,结果没发现有什么加密算法。

程序分析

程序为典型的Win32 GUI程序,程序创建了一个对话框,通过对话框的消息处理函数可以定位到关键函数的地址为0x402652。

根据后面的判断v38必须为0,可以得到输入的长度必须大于等于12,且第0位和第1位不能同时为A,第5位和第11位必须同时为V,输入必须为可见字符。

程序先将输入的第5位和第11位给去除了,然后和进行了base64解码(表被替换了)再编码的结果进行比较,如果相等才会进入4024e1这个函数,而402A90这个函数是解密输出的字符串用的,通过调试,可以得到v7必须为2,才会有如下所示提示弹出。

函数4024e1的参数是base64解码后的数据。

通过动态调试发现,程序中有如下大数结构
struct bignum{
int flag;(标识正负,1为正)
int length;
int data[length];
}
函数401485的作用是比较2个大数的大小,函数4020F1是求A的B次方模C。
故函数4024E1的作用就是求base64解码后的数据的83次方然后模0x41CD66ACC237B22681A18067
因此最后问题化简为了x**83mod0x41CD66ACC237B22681A18067=2,求x的值。

模幂求底


参考kkhaike大佬的这篇题解

完整的代码

import base64
n=0x41CD66ACC237B22681A18067
#x**83mod n =2
#n=3*5*7*11*13*17*19*23*29*31*37*41*43*47*53*59*61*67*71*73
def egcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = egcd(b % a, a)  
        return (g, x - (b // a) * y, y)

def modinv(a, m):
    g, x, y = egcd(a, m)
    if (g != 1):
        print('modular inverse does not exist')
    else:
        return x % m
m=2*4*6*10*12*16*18*22*28*30*36*40*42*46*52*58*60*66*70*72
e=83
d=modinv(e,m)
x=pow(2,d,n)

print(hex(x))
H=hex(x)[2:]
hh=[int(H[i:i+2],16) for i in range(0,len(H),2)]
tmp=str(base64.b64encode(bytes(hh)),"utf-8")
s="ABCyVPGHTJKLMNOFQRSIUEWDYZgbc8sfah1jklmnopqret5v0xX9wi234u67dz+/"
s1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
flag=""

for i in tmp:
    flag=flag+s[s1.find(i)]
print(flag)
#  PEDIyV9102dVreadyu

看雪学院推出的专业资质证书《看雪安卓应用安全能力认证 v1.0》(中级和高级)!

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回