Hack is fun

I choose to be a hacker just because it's fun.

Programming • Penetration • Reverse • Sectool
  • Programming

    Show me the code.

  • Penetration

    Know it and hack it.

  • Reverse

    Everything can be pwn.

  • Sectool

    Sharp tools make good work.

sunnyelf

python实现基于米勒拉宾素性检测算法最快的超大数素性检测

作者: 分类: 学习记录 评论: 暂无 时间: 2017-03-26 浏览: 1,351 次

0x00 米勒拉宾素性检测算法伪代码

米勒拉宾素性检测算法的伪代码:

Input #1: n > 3, an odd integer to be tested for primality;
Input #2: k, a parameter that determines the accuracy of the test
Output: composite if n is composite, otherwise probably prime

write n − 1 = (2 ^ r) * d with d odd by factoring powers of 2 from n − 1
WitnessLoop: repeat k times:
   pick a random integer a in the range [2, n − 2]
   x ← a^d mod n
   if x = 1 or x = n − 1 then
      continue WitnessLoop
   repeat r − 1 times:
      x ← x^2 mod n
      if x = 1 then
         return composite
      if x = n − 1 then
         continue WitnessLoop
   return composite
return probably prime

0x01 实现

一开始针对这个米勒拉宾素性检测算法里的幂模运算,我以为用蒙哥马利算法-快速幂模要比pow()函数更快,结果还是内置的pow()更快:

# x = a^d n n
def montgomery(a, d, n):
    x = 1
    while d:
        if (d & 1):
            x = (x * a) % n
        d >>= 1  
        a = (a * a) % n
    return x

上面的伪代码中a的选取是可以优化的,可以看到下面代码有实现,原理看一下wikipedia

def select_a_list(n):
    if n < 2047:
        return [2,]
    elif n < 1373653:
        return [2, 3]
    elif n < 9080191:
        return [31, 73]
    elif n < 25326001:
        return [2, 3, 5]
    elif n < 3215031751:
        return [2, 3, 7]
    elif n < 4759123141:
        return [2, 7, 61]
    elif n < 1122004669633:
        return [2, 13, 23, 1662803]
    elif n < 2152302898747:
        return [2, 3, 5, 7, 11]
    elif n < 3474749660383:
        return [2, 3, 5, 7, 11, 13]
    elif n < 341550071728321:
        return [2, 3, 5, 7, 11, 13, 17]
    elif n < 3825123056546413051:
        return [2, 3, 5, 7, 11, 13, 17, 19, 23]
    elif n < 318665857834031151167461:
        return [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]
    elif n < 3317044064679887385961981:
        return [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41]
    else:
        return [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

0x02 测试

用这个方法检测素数,100位10进制数平均0.0003,1000位10进制数平均0.09秒,10000位10进制数平均60秒。

0x03 完整代码

#!/usr/bin/env python
# coding=utf-8
# author:admin[@hackfun.org]
# license:GPL v3
# blog:hackfun.org

def select_a_list(n):
    if n < 2047:
        return [2,]
    elif n < 1373653:
        return [2, 3]
    elif n < 9080191:
        return [31, 73]
    elif n < 25326001:
        return [2, 3, 5]
    elif n < 3215031751:
        return [2, 3, 7]
    elif n < 4759123141:
        return [2, 7, 61]
    elif n < 1122004669633:
        return [2, 13, 23, 1662803]
    elif n < 2152302898747:
        return [2, 3, 5, 7, 11]
    elif n < 3474749660383:
        return [2, 3, 5, 7, 11, 13]
    elif n < 341550071728321:
        return [2, 3, 5, 7, 11, 13, 17]
    elif n < 3825123056546413051:
        return [2, 3, 5, 7, 11, 13, 17, 19, 23]
    elif n < 318665857834031151167461:
        return [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]
    elif n < 3317044064679887385961981:
        return [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41]
    else:
        return [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

def calc_r_d(n):
    n -= 1
    r = 0
    d = n
    while 1:
        if n % 2 != 0:
            break
        r += 1
        d = n / 2
        n /= 2
    return r, d

def miller_rabin_primality_test(n):
    """use miller rabin primality test to judge n whether prime"""
    if n < 0:
        n = -n
    if n < 2:
        return False
    if n == 2 or n == 3:
        return True
    r, d = calc_r_d(n)
    a_list = select_a_list(n)
    for k in xrange(len(a_list)):
        a = random.sample(a_list, 1)[0] # Select one non-repeating random number from the list at a time
        a_list.remove(a)
        x = pow(a, d, n)
        if x == 1 or x == n - 1:
            continue
        for t in xrange(r - 1):
            x = pow(x, 2, n)
            if x ==1:
                return False
            if x == n - 1:
                break
        else:
            return False
    return True

浅析弱口令

作者: 分类: 渗透测试 评论: 2条 时间: 2017-03-16 浏览: 13,472 次

浅析弱口令.png

0x00 前言

弱口令其实是长期以来一直存在的问题,直到今天我们还能经常听某个著名厂商公司因为存在弱口令问题而导致大量内部或外部用户信息泄露,甚至商业计划和机密泄露,所以一个安全密码设置的重要性不言而喻,涉及密码,不得谈到密码的强弱,当然强弱密码的区分没有一个严格明确的定义,通常认为容易被别人(他们有可能对你很了解)猜测到或容易被破解工具破解的口令均为弱密码,在此我粗略谈谈弱密码方面,也就是我们经常说到的弱口令。

其实设置密码的强弱很大程度上与这个人的个人习惯和安全意识有关,当然还是受其他的因素的影响,比如公司出于安全考虑要求设置强密码等其他强制硬性要求,个人觉得弱口令可以大致分为两类,一类就是公共弱口令,另一类就是个人弱口令。

阅读全文»

尽最大可能分析上传源码及漏洞利用方式

作者: 分类: 渗透测试 评论: 2条 时间: 2017-03-03 浏览: 8,290 次

0x00 简单源码分析

<?php
if ((($_FILES["file"]["type"] == "image/gif")       //检测Content-type值
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))              //检测文件大小
  {
  $ext = end(explode('.', $_FILES["file"]["name"]));  //获取最后“.”的后缀
  if($ext === 'php')                          //检测是否为php后缀
    {
    exit('error');
    }
  if ($_FILES["file"]["error"] > 0)           //返回上传错误码
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else                                                  //返回上传成功信息
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("upload/" . $_FILES["file"]["name"]))  //检测文件是否存在
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else                          //将上传的临时文件转移到指定存放文件夹
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";              //返回无效文件的错误信息
  }
?>

阅读全文»

一道有趣的网络取证分析CTF题目

作者: 分类: CTF 评论: 1条 时间: 2017-02-28 浏览: 5,708 次

0x01 解题

这是一道新颖的网络取证分析的题目,用TCP协议紧急数据来隐藏发送flag,很多选手都被其中的图片带偏了方向,导致花了很多时间也没有做出来,其实刚开始我也被带入坑:-(

阅读全文»

CTF中那些脑洞大开的编码和加密

作者: 分类: CTF 评论: 16条 时间: 2017-02-23 浏览: 28,483 次

0x00 前言

正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问题:表哥,你知道这是什么加密吗?其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进行一些处理,但是会给留一些线索,所以写此文的目的是想给小伙伴做题时给一些参考,当然常在CTF里出现的编码也可以了解一下。本来是想尽快写出参考的文章,无奈期间被各种事情耽搁导致文章断断续续写了2个月,文章肯定有许多没有提及到,欢迎小伙伴补充,总之,希望对小伙伴们有帮助吧!

0x01 目录

常见编码:
    1.ASCII编码
    2.Base64/32/16编码
    3.shellcode编码
    4.Quoted-printable编码
    5.XXencode编码
    6.UUencode编码
    7.URL编码
    8.Unicode编码
    9.Escape/Unescape编码
    10.HTML实体编码
    11.敲击码(Tap code)
    12.莫尔斯电码(Morse Code)
    13.编码的故事

各种文本加密

换位加密:
    1.栅栏密码(Rail-fence Cipher)
    2.曲路密码(Curve Cipher)
    3.列移位密码(Columnar Transposition Cipher)
    
替换加密:
    1.埃特巴什码(Atbash Cipher)
    2.凯撒密码(Caesar Cipher)
    3.ROT5/13/18/47
    4.简单换位密码(Simple Substitution Cipher)
    5.希尔密码(Hill Cipher)
    6.猪圈密码(Pigpen Cipher)
    7.波利比奥斯方阵密码(Polybius Square Cipher)
    8.夏多密码(曲折加密)
    9.普莱菲尔密码(Playfair Cipher)
    10.维吉尼亚密码(Vigenère Cipher)
    11.自动密钥密码(Autokey Cipher)
    12.博福特密码(Beaufort Cipher)
    13.滚动密钥密码(Running Key Cipher)
    14.Porta密码(Porta Cipher)
    15.同音替换密码(Homophonic Substitution Cipher)
    16.仿射密码(Affine Cipher)
    17.培根密码(Baconian Cipher)
    18.ADFGX和ADFGVX密码(ADFG/VX Cipher)
    19.双密码(Bifid Cipher)
    20.三分密码(Trifid Cipher)
    21.四方密码(Four-Square Cipher)
    22.棋盘密码(Checkerboard Cipher)
    23.跨棋盘密码(Straddle Checkerboard Cipher)
    24.分组摩尔斯替换密码(Fractionated Morse Cipher)
    25.Bazeries密码(Bazeries Cipher)
    26.Digrafid密码(Digrafid Cipher)
    27.格朗普雷密码(Grandpré Cipher)
    28.比尔密码(Beale ciphers)
    29.键盘密码(Keyboard Cipher)

其他有趣的机械密码:
    1.恩尼格玛密码

代码混淆加密:
    1.asp混淆加密
    2.php混淆加密
    3.css/js混淆加密
    4.VBScript.Encode混淆加密
    5.ppencode
    6.rrencode
    7.jjencode/aaencode
    8.JSfuck
    9.jother
    10.brainfuck编程语言

相关工具

参考网站

阅读全文»

深入理解JPEG图像格式Jphide隐写

作者: 分类: CTF 评论: 6条 时间: 2017-02-08 浏览: 49,573 次

0x00 隐写原理

Jphide是基于最低有效位LSB的JPEG格式图像隐写算法,使用JPEG图像作为载体是因为相比其他图像格式更不容易发现隐藏信息,因为JPEG图像在DCT变换域上进行隐藏比空间域隐藏更难检测,并且鲁棒性更强,同时Blowfish算法有较强的抗统计检测能力。

由于JPEG图像格式使用离散余弦变换(Discrete Cosine Transform,DCT)函数来压缩图像,而这个图像压缩方法的核心是:通过识别每个8×8像素块中相邻像素中的重复像素来减少显示图像所需的位数,并使用近似估算法降低其冗余度。因此,我们可以把DCT看作一个用于执行压缩的近似计算方法。因为丢失了部分数据,所以DCT是一种有损压缩(Loss Compression)技术,但一般不会影响图像的视觉效果。

0x01 隐写过程

Jphide隐写过程大致为:先解压压缩JPEG图像,得到DCT系数;然后对隐藏信息用户给定的密码进行Blowfish加密;再利用Blowfish算法生成伪随机序列,并据此找到需要改变的DCT系数,将其末位变为需要隐藏的信息的值。最后把DCT系数重新压回成JPEG图片,下面是个人对隐写过程理解画出的大致流程图。

阅读全文»

pyonlinedict Linux终端在线字典

作者: 分类: 神兵利器 评论: 暂无 时间: 2017-01-26 浏览: 3,474 次

pyonliedict.gif

0x00 前言

有时候使用linux,在终端经常遇到一些不会的英文单词句子,又嫌难得再去开个浏览器去查,于是便动手写一个在终端就可以查询的脚本,有兴趣将将就用用吧。

0x01 中文说明

1.介绍

pyonlinedict是一个基于python 2.7开发的命令行在线字典,支持27种语言的字词或句子翻译查询,当我们遇到不会字词或句子时,可以通过它轻松查询意思。

2.安装

git clone https://github.com/sunnyelf/pyonlinedict.git

cd pyonlinedict

tar -xzvf pyonlinedict-1.0.6.tar.gz

python setup.py install --record install_path.txt

或者直接:

pip install pyonlinedict

4.用法

用法:pyonlinedict [选项]

  选项:
   -h,--help         显示帮助消息并退出
   
   -q,--query        要查询的字或句子(必需的参数)
   
   -f,--from         输入语言的类型(默认设置:auto)
   
   -t,--to           输出语言的类型(默认设置:zh)
   
   -l,--list         列出支持的语言类型
   
   -v,-version       显示当前版本号和作者信息

  用例:
  
   pyonlinedict -h
   
   pyonlinedict -l
   
   pyonlinedict -v
   
   pyonlinedict -q hello
   
   pyonlinedict -q hello -f en -t zh
   
   pyonlinedict -q 'hello world' -f en -t zh

5.卸载

cat install_path.txt | xargs rm -rf

通过pip方式安装的卸载方法:

pip uninstall pyonliedict

阅读全文»

CTF中图片隐藏文件分离方法总结

作者: 分类: CTF 评论: 9条 时间: 2017-01-12 浏览: 28,504 次

0x00 前言

在安全的大趋势下,信息安全越来越来受到国家和企业的重视,所以CTF比赛场次越来越多,而且比赛形式也不断的创新,题目也更加新颖有趣,对选手的综合信息安全能力有一个较好的考验,当然更好的是能从比赛有所收获,不断学习和总结提升自己的信息安全能力与技术。转到CTF比赛上,通常在CTF比赛中常有与隐写术(Steganography)相关的题目出现,这里我们讨论总结图片隐藏文件分离的方法,欢迎大家补充和交流:P

阅读全文»