看雪CTF 密界寻踪
本帖最后由 buzhifou01 于 2019-12-8 15:23 编辑0x01破解过程
1.运行程序,发现是终端程序,从main函数入手。
2.查壳发现无壳,接下来使用krypto analyzer插件来分析程序使用的算法,发现使用了密码学函数库Miracl和S库算法,Miracl库是针对公钥密码学和椭圆曲线密码学,由于有S盒,那么使用了AES算法。
3.进入main函数,进入4031d2处发现输出欢迎信息的函数welcome,接着进入4031e0处函数,发现这是个对数组进行异或处理的函数。
4.往下看,进入403241函数,该函数是对字符串进行编码的函数,接着看403249处函数,发现该函数是比较复杂的处理函数,处理了输入字符串的部分。
5.接下来用OD载入(换了OD),在deal1,xor函数处下断,先不管xor和deal1的算法,先运行看看有没有什么有价值的信息,发现运行两次xor,ecx的值分别为208CBB7CD6ECC64516D07D978F5F0681F534EAD235D5C49ADD72D2DB840D5304和7da39de66016477b1afc3dc8e309dc429b5de855f0d616d225b570b68b88a585
6.接着看deal1下面的代码,发现了powmod函数,它是一个幂取模函数,那么deal1很可能使用了RSA算法对数据进行加密,显然我们要进行解密.
7.接着在OD中运行,我们发现函数CrackMe.00409350运行了四次并且传入的参数都为0,联想到是mirvar(0)对大数进行初始化,下面就要使用cinstr函数进行初始化,接着看到3e9,该为指数e。
8.运行到402ACE push edx时,出现了7da39de66016477b1afc3dc8e309dc429b5de855f0d616d225b570b68b88a585,指数,根据公式,可知接着要进行加密运算,那么7da39de66016477b1afc3dc8e309dc429b5de855f0d616d225b570b68b88a585为模。
9.运行的过程中出现了加密密文,运行到strcmp这里,出现了208CBB7CD6ECC64516D07D978F5F0681F534EAD235D5C49ADD72D2DB840D5304,显然这是正确的密文,比较之后eax为-1。
10.现在知道了模数n,指数e,密文c,根据公式,可求出明文了,下面有求解算法。
11.deal1函数下方有函数deal_digit,进入该函数,可知是检验数字的,运行到0040327B push eax,发现字符串的第四位变为CC,那么推出的deal2函数只处理字符串前三位。
12.根据第二步,deal2函数使用了AES算法,进入402ecc处函数,发现是一个初始化函数,分别进入sub_402340和sub_40DC40,发现sub_402340为信息输出函数out_info,那么sub_40DC40为加密函数encode。
13.运行到402e61时,发现要对图上两个字符串,进行异或处理,出现了0001314000000000(缺少前三位的key1)和912CA2036A9A0656D17B6B552F157F8E
14.运行到402eA2,发现前三位为124(key2),传入加密函数的参数有pediy(明文),运行到strcmp,发现了912CA2036A9A0656D17B6B552F157F8E,显然这是正确的密文。
15,接下来求解正确的密钥key2。
fromdecimal import Decimal
import math, time
#coding -*- utf:8 -*-
from Crypto.Cipher import AES
import string
def ex_gcd(a, b):
if b == 0:
return 1, 0
x1, y = 1, 1
x, y1 = 0, 0
c, d = a, b
q = int(c / d)
r = c % d
while r != 0:
c = d
d = r
x1, x = x, x1 - x * q
y1, y = y, y1 - y * q
q = int(c / d)
r = c % d
return x, y
def poww_mod(a, b, mod):
res = 1
while b != 0:
if b & 1 == 1:
res = res * a % mod
a = a * a % mod
b >>= 1
return res
def crack():
n=0x7da39de66016477b1afc3dc8e309dc429b5de855f0d616d225b570b68b88a585
m=0x208CBB7CD6ECC64516D07D978F5F0681F534EAD235D5C49ADD72D2DB840D5304
e=0x3e9
#p,q=find_prims_factor(n=n)
p=208096057845685678782766058500526476379
q=273086345401562743300402731618892888991
fi=(p-1)*(q-1)
d=max(ex_gcd(fi,b=e))
ans=poww_mod(m,d,n)
flag = hex(ans).decode('hex')
return flag
def AES_key():
p="pediy"
c="912CA2036A9A0656D17B6B552F157F8E"
def encrypt(plain,key):
bs = AES.block_size
plain = plain+"\x00"*(bs-len(plain))
cipher = AES.new(key)
return cipher.encrypt(plain).encode('hex').upper()
table = string.digits
for i in table:
for j in table:
for k in table:
key="%s1314000000000"%(i+j+k)
c1 = encrypt(p,key)
if c1 == c:
k=chr(ord(k)-1)
return i+j+k
print AES_key()+crack()
最终的flag为:520iamahandsomeguyhaha1
题目链接:https://pan.baidu.com/s/1GnoCEAcmyKCyXQNnziyFMQ
提取码:zbwn 我去,看雪现在还存在呀 感谢楼主的分享 支持LZ。 高级追码,学习了
666,赞一个,学习了。 真不看懂呢? 算法逆向分析学起来好头疼{:1_937:} 谢谢大大分享 感谢楼主分享。
页:
[1]
2