【杂项入门-颜文字】

  • A+
所属分类:逆向工程

杂项第一题: color


【杂项入门-颜文字】

下载压缩包:https://ctf.bugku.com/files/b5f4b306f5cb020e91308895cf5ad767/81cf84c2-0901-46d8-80c7-f0844e7e5253.zip

下载解压后 发下是 0-6   一共七张图片 

【杂项入门-颜文字】

查看属性没什么发现

那么我们在 StegSolve中依次查看 发现!!!!!!!

【杂项入门-颜文字】

【杂项入门-颜文字】

【杂项入门-颜文字】

【杂项入门-颜文字】

【杂项入门-颜文字】

【杂项入门-颜文字】

【杂项入门-颜文字】

Make me tall

让我变高

发现提交不了  那么  意思是让我变高   那么我们就在 十六进制编译器里面把他们都变高看看

IHDR后八个字节

【杂项入门-颜文字】

改高后,看图

【杂项入门-颜文字】

白和黑,我们把其他图也改了

【杂项入门-颜文字】

我们

把白色转为0 黑色转为1
得到七串二进制

11111111010111101111

11111011111110111111

00001100101010110001

01001010010000001101

11010011011101010111

10011011011010110110

00111001101101111101

发现第一列从上到下的二进制码刚好对应 的ascii码

1100110  对应 f  

 

c1 = '11111111010111101111'

c2 = '11111011111110111111'

c3 = '00001100101010110001'

c4 = '01001010010000001101'

c5 = '11010011011101010111'

c6 = '10011011011010110110'

c7 = '00111001101101111101'

 

flag = ''

 

for i in range(0,20):

    c =c1[i]+c2[i]+c3[i]+c4[i]+c5[i]+c6[i]+c7[i]

    flag += chr(int(c,2))

 

print flag

【杂项入门-颜文字】

得到

flag{Png1n7erEs7iof}


杂项第二题: 小明的密码

97年出生的小明用自己的生日作为自己网站的密码,现在,得到一串被篡改过一个字符的字符串,你能解出小明的生日吗?

 

0175501585710a89h5a60dc9ed2f88d7

 

md5加密

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import hashlib

s = '0175501585710a89h5a60dc9ed2f88d7'
for day in range(1, 32):
    for month in range(1, 13):
        birth = '1997%02d%02d' % (month,day)
        m = hashlib.md5()
        m.update(birth)
        md5 = m.hexdigest()
        if s[:10] in md5:   #以部分字符串的值来对比完整字符串
            print md5
            print birth

 

【杂项入门-颜文字】



杂项第三题: 仿射加密

已知仿射加密变换为c=(11m+7)mod26,试对密文dikxourxd解密

 

一、脚本解密


#!/usr/bin/env python
# -*- coding: UTF-8 -*-
a = 'dikxourxd'
a1=[]
for i in a:
    a2 = ord(i)-97
    a1.append(a2)
print a1
s = ""
for i in a1:
    for j in range(0,26):
        c = (11*j+7)%26
        if(c==i):
            s += chr(j+97)
print s

【杂项入门-颜文字】

二、网站解密

工具解密

【杂项入门-颜文字】



杂项第四题: 黑客的机密信息

黑客通过webshell往Web服务器写入了一串机密信息,你能找出机密信息吗?

首先分析流量包,过滤http请求,在数据包末端发现shell.php,利用Wireshark的filter过滤出带有shell.php的流量,http contains"shell.php"

利用一句话执行的命令都经过base64编码,不能直接搜索到flag关键词。

【杂项入门-颜文字】

通过跟踪流来查找flag

【杂项入门-颜文字】

【杂项入门-颜文字】

仿射密码解析与实例


仿射密码

原理

仿射密码的加密函数是 E(x)=(ax+b)(modm)

,其中

  • x表示明文按照某种编码得到的数字

  • a和 m互质

  • m是编码系统中字母的数目。

解密函数是 D(x)=a−1(x−b)(modm)

,其中 a−1 是 a 在 Zm

群的乘法逆元。

下面我们以 E(x)=(5x+8)mod26

函数为例子进行介绍,加密字符串为 AFFINE CIPHER,这里我们直接采用字母表26个字母作为编码系统

【杂项入门-颜文字】

其对应的加密结果是 IHHWVCSWFRCP

对于解密过程,正常解密者具有a与b,可以计算得到 a−1为 21,

所以其解密函数是D(x)=21(x−8)(mod26)

,解密如下

【杂项入门-颜文字】

可以看出其特点在于只有 26 个英文字母。

破解

首先,我们可以看到的是,仿射密码对于任意两个不同的字母,其最后得到的密文必然不一样,所以其也具有最通用的特点。当密文长度足够长时,我们可以使用频率分析的方法来解决。

其次,我们可以考虑如何攻击该密码。可以看出当a=1

时,仿射加密是凯撒加密。而一般来说,我们利用仿射密码时,其字符集都用的是字母表,一般只有26个字母,而不大于26的与26互素的个数一共有

ϕ(26)=ϕ(2)×ϕ(13)=12

算上b的偏移可能,一共有可能的密钥空间大小也就是

12×26=312

一般来说,对于该种密码,我们至少得是在已知部分明文的情况下才可以攻击。下面进行简单的分析。

这种密码由两种参数来控制,如果我们知道其中任意一个参数,那我们便可以很容易地快速枚举另外一个参数得到答案。

但是,假设我们已经知道采用的字母集,这里假设为26个字母,我们还有另外一种解密方式,我们只需要知道两个加密后的字母 y1,y2

即可进行解密。那么我们还可以知道

y1=(ax1+b)(mod26)y2=(ax2+b)(mod26)

两式相减,可得

y1−y2=a(x1−x2)(mod26)

这里 y1,y2

已知,如果我们知道密文对应的两个不一样的字符 x1 与 x2 ,那么我们就可以很容易得到 a ,进而就可以得到 b 了。

例子

这里我们以TWCTF 2016 的 super_express为例进行介绍。简单看一下给的源码

import sys

key = '****CENSORED***************'

flag = 'TWCTF{*******CENSORED********}'

 

if len(key) % 2 == 1:

   print("Key Length Error")

   sys.exit(1)

 

n = len(key) / 2

encrypted = ''

for c in flag:

    c= ord(c)

   for a, b in zip(key[0:n], key[n:2*n]):

       c = (ord(a) * c + ord(b)) % 251

   encrypted += '%02x' % c

 

print encrypted

 

【杂项入门-颜文字】

可以发现,虽然对于 flag 中的每个字母都加密了 n 次,如果我们仔细分析的话,我们可以发现

c1=a1c+b1c2=a2c1+b2=a1a2c+a2b1c+b2=kc+d

根据第二行的推导,我们可以得到其实 cn

也是这样的形式,可以看成 cn=xc+y

,并且,我们可以知道的是,key 是始终不变化的,所以说,其实这个就是仿射密码。

此外,题目中还给出了密文以及部分部分密文对应的明文,那么我们就很容易利用已知明文攻击的方法来攻击了,利用代码如

 

   import gmpy

    

   key = '****CENSORED****************'

   flag = 'TWCTF{*******CENSORED********}'

    

    f= open('encrypted', 'r')

   data = f.read().strip('n')

   encrypted = [int(data[i:i + 2], 16) for i in range(0, len(data), 2)]

   plaindelta = ord(flag[1]) - ord(flag[0])

   cipherdalte = encrypted[1] - encrypted[0]

    a= gmpy.invert(plaindelta, 251) * cipherdalte % 251

    b= (encrypted[0] - a * ord(flag[0])) % 251

   a_inv = gmpy.invert(a, 251)

   result = ""

   for c in encrypted:

       result += chr((c - b) * a_inv % 251)

   print result

 

【杂项入门-颜文字】

结果如下:

  TWCTF2016-super_express git:(master) python exploit.py

TWCTF{Faster_Than_Shinkansen!}

 

 

杂项第五题: 远控木马

某次应急响应时,工程师发现一个远控木马的客户端程序,请分析该远程控制木马的控制端IP及端口号。

在虚拟机上运行netstat -ano查看

【杂项入门-颜文字】



杂项第六题: Web漏洞

黑客利用漏洞从Web系统中窃取了什么机密信息?

日志读取

#!/usr/bin/env python

# -*- coding: UTF-8 -*-

import urllib

import re

 

 

flag = ''

flag_list = []

 

with open('access.log', 'r') as file:

   #print file.read()

   line_lists = file.readlines()

   #print len(line_lists)

   flag_lines = []

   for i in line_lists:

       if 'flag' in i:

           flag_lines.append(i)

   #print len(flag_lines)

 

 

   for i in flag_lines:

       s = i.split(" ")[6]

       s=urllib.unquote(s)

       if '!=' in s :

           print s

           p = re.compile(r'!=[1-9]d*')

            flag = flag +chr(int(p.findall(s)[0].replace('!=','')))

 

print flag

【杂项入门-颜文字】



bugku-ctf 第七题:颜文字

(ノ`Д)ノ

【杂项入门-颜文字】


本文始发于微信公众号(LemonSec):【杂项入门-颜文字】

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: