-
-
[原创]2019看雪CTF晋级赛Q1-第五题writeup
-
2019-3-17 01:35 2634
-
观察
题目描述为考查密码学知识,猜测题目可能包含一些密码算法。用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
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
赞赏
他的文章
看原图