buzhifou01 发表于 2019-12-8 15:09

看雪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

Crazy土匪 发表于 2019-12-8 15:49

我去,看雪现在还存在呀

a970553652 发表于 2019-12-8 16:00

感谢楼主的分享

天山雪 发表于 2019-12-9 00:12

支持LZ。

dutyzqly 发表于 2019-12-9 09:08

高级追码,学习了

ye8974 发表于 2019-12-9 10:08

666,赞一个,学习了。

daymissed 发表于 2019-12-9 10:12

真不看懂呢?

CHILAS_LEE 发表于 2019-12-9 10:14

算法逆向分析学起来好头疼{:1_937:}

zhanglei91186 发表于 2019-12-9 10:18

谢谢大大分享

dagege 发表于 2019-12-9 12:07

感谢楼主分享。
页: [1] 2
查看完整版本: 看雪CTF 密界寻踪