南邮网络攻防训练

Author Avatar
Tr0y 9月 26, 2016 09:26:46 本文共 5.7k 字
  • 文为知己者书
  • 在其它设备中阅读本文章

南邮网络攻防训练的部分题解

地址

网站地址


WEB

签到题

这一定是最简单的
传送门:http://chinalover.sinaapp.com/web1/


“key 在哪里? “
在源码里~


md5 collision

源码

<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
    echo "nctf{*****************}";
} else {
    echo "false!!!";
}}
else{echo "please input a";}
?>

题目链接 http://115.28.150.176/md5/index.php


看源码.熟悉的’QNKCDZO’.肯定是利用’==’的特性啦.让 a=240610708 就行啦


签到 2

地址:来源:网络攻防大赛


限制输入 10 个字符,而”zhimakaimen”有 11 个.那么直接 post 就行啦


这题不是 WEB

真的,你要相信我!这题不是 WEB
传送门:题目地址.


有个图片,下下来看看.用 notepad 打开,找一找就有啦~


层层递进

黑客叔叔 p0tt1 的题目
欢迎大家关注他的微博~
题目传送门:题目地址


看源码,发现了个 src="SO.html"
点进去看看,又是一个 src="SO.html"
层层递进估计就这意思吧,继续点
在不知道点了几次之后 src="404.html"
点进去

<!--  
<script src="./js/jquery-n.7.2.min.js"></script>
<script src="./js/jquery-c.7.2.min.js"></script>
<script src="./js/jquery-t.7.2.min.js"></script>
<script src="./js/jquery-f.7.2.min.js"></script>
<script src="./js/jquery-{.7.2.min.js"></script>
<script src="./js/jquery-t.7.2.min.js"></script>
<script src="./js/jquery-h.7.2.min.js"></script>
<script src="./js/jquery-i.7.2.min.js"></script>
<script src="./js/jquery-s.7.2.min.js"></script>
<script src="./js/jquery-_.7.2.min.js"></script>
<script src="./js/jquery-i.7.2.min.js"></script>
<script src="./js/jquery-s.7.2.min.js"></script>
<script src="./js/jquery-_.7.2.min.js"></script>
<script src="./js/jquery-a.7.2.min.js"></script>
<script src="./js/jquery-_.7.2.min.js"></script>
<script src="./js/jquery-f.7.2.min.js"></script>
<script src="./js/jquery-l.7.2.min.js"></script>
<script src="./js/jquery-4.7.2.min.js"></script>
<script src="./js/jquery-g.7.2.min.js"></script>
<script src="./js/jquery-}.7.2.min.js"></script>
-->

竖着看 - 后面的字符,就是 flag 啦~


AAencode

javascript aaencode

http://115.28.150.176/aaencode.txt


在源码里复制,丢到 firebug 的控制台运行得 flag
在源码里复制是为了保证能复制完全


单身二十年

这题可以靠技术也可以靠手速!
老夫单身二十年,自然靠的是手速!
题目地址:撸了他!


看源码,有个 <a href="./search_key.php">_到这里找 key__</a>
点进去,flag 就在里面~


你从哪里来

你是从 google 来的吗?
http://115.28.150.176/referer/index.php


从 google 来,那就改 Referer 咯,然后 post 过去就行了


php decode

见到的一个类似编码的 shell,请解码

<?php
function CLsI($ZzvSWE) {

    $ZzvSWE = gzinflate(base64_decode($ZzvSWE));

    for ($i = 0; $i < strlen($ZzvSWE); $i++) {

        $ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1);

    }

    return $ZzvSWE;

}eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA=="));?>

eval 改为 echo,运行就行了


文件包含

没错 这就是传说中的 LFI
传送门点我带你飞

TIPS:http://drops.wooyun.org/tips/3827


乌云已经打不开了.GG.先跳过


单身一百年也没用

是的。。这一题你单身一百年也没用
传送门:biu~


用 brupsuite 抓包就行啦


Download~!

想下啥就下啥~别下音乐,不骗你,试试下载其他东西~
真·奥义·传送:点我


看源码,发现

<a href="download.php?url=eGluZ3hpbmdkaWFuZGVuZy5tcDM="

“eGluZ3hpbmdkaWFuZGVuZy5tcDM=”解码就是
xingxingdiandeng.mp3
看来文件名要经过 base64 加密
“试试下载其他东西~”,下啥呢..试了好多,什么 flag.php,key.php,flag.html,key.html…最后发现 download.php 有东西

<?php
error_reporting(0);
include("hereiskey.php");
$url=base64_decode($_GET[url]);
if( $url=="hereiskey.php" || $url=="buxiangzhangda.mp3" || $url=="xingxingdiandeng.mp3" || $url=="download.php"){
    $file_size = filesize($url);
    header ( "Pragma: public" );
    header ( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
    header ( "Cache-Control: private", false );
    header ( "Content-Transfer-Encoding: binary" );
    header ( "Content-Type:audio/mpeg MP3");
    header ( "Content-Length: " . $file_size);
    header ( "Content-Disposition: attachment; filename=".$url);
    echo(file_get_contents($url));
    exit;
}
else {
    echo "Access Forbidden!";
}
?>

很明显了,访问 hereiskey.php 就行了(当然要 base64)


COOKIE

COOKIE 就是甜饼的意思~
地址:传送门

TIP:
0==not


打开发现啥都没,抓个包
发现”Cookie: Login=0”,改为 1 就行啦~


MYSQL

不能每一题都这么简单嘛
你说是不是?
题目地址


提示这么明显了,打开 robots.txt 看看

TIP:sql.php

<?php
if($_GET[id]) {
   mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
  mysql_select_db(SAE_MYSQL_DB);
  $id = intval($_GET[id]);
  $query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));
  if ($_GET[id]==1024) {
      echo "<p>no! try again</p>";
  }
  else{
    echo($query[content]);
  }
}
?>

既然限制了直接输入 1024,说明要查的 id 很有可能就是 1024.intval()将变量转成整数类型,默认是转为 10 进制.那么我们输入 1024.1 就行了.intval()会把 1024.1 变为 1024,这样查的时候 id=1024,而 if ($_GET[id]==1024)的时候 1024.1!=1024


sql injection 3
200

http://115.28.150.176/sqli/index.php?id=1


这题有点难
查了一下
资料 1(http://www.2cto.com/article/201209/153283.html)
资料 2(http://www.2cto.com/article/201207/139595.html)

构造语句
http://115.28.150.176/sqli/index.php?id=1%d5%27%20union%20select%20*,0%20from%20flag%20%23

成功拿到 flag

嗨呀,我还是太菜.慢慢学吧


/x00

题目地址:题目有多种解法,你能想出来几种?


    if (isset ($_GET['nctf'])) {
        if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
            echo '必须输入数字才行';
        else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)   
            die('Flag: '.$flag);
        else
            echo '骚年,继续努力吧啊~';
    }

既要是纯数字,又要有’#biubiubiu’.strpos()找的是字符串,那么传一个数组给它,strpos()出错返回 null,null!==false,所以符合要求.
所以输入 nctf[]=就行了~
那为什么 ereg()也能符合呢?因为 ereg()在出错时返回的也是 null,null!==false,所以符合要求.
当然,正常做法应该是字符串截断,利用 ereg()的 NULL 截断漏洞,绕过正则过滤.毕竟题目是/x00 嘛.即
nctf=1%00%23biubiubiu
ok~


bypass again

地址:依旧是弱类型

来源 hctf


if (isset($_GET['a']) and isset($_GET['b'])) {
if ($_GET['a'] != $_GET['b'])
if (md5($_GET['a']) === md5($_GET['b']))
die('Flag: '.$flag);
else
print 'Wrong.';
}

既要 a!=b,又要 md5(a)===md5(b)
做法和上一题一样,传数组让 md5()出错,返回 null,那么判断的时候就是 null===null


变量覆盖

听说过变量覆盖么?
地址: 题目地址


看一下 source.p1hp,extract($_POST);
那么只要 post pass 和 thepassword_123(值要相等)覆盖掉默认的 thepassword_123 的值,就可以得到 flag 了.抓包改包~


PHP 是世界上最好的语言

听说 PHP 是世界上最好的语言
地址:题目地址


打开 index.txt 看看

<?php
if(eregi("hackerDJ",$_GET[id])) {
  echo("<p>not allowed!</p>");
  exit();
}

$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
  echo "<p>Access granted!</p>";
  echo "<p>flag: *****************} </p>";
}
?>

eregi — 不区分大小写的正则表达式匹配.那也就是说,不能使 id=hackerDJ,但是又要经过 urldecode()后== “hackerDJ”.那么我们可以把”hackerDJ”进行 url 编码,再把编码再次进行编码.即(%25%36%38%25%36%31%25%36%33%25%36%62%25%36%35%25%37%32%25%34%34%25%34%61)
这样 post 过去就满足代码了


伪装者

这是一个到处都有着伪装的世界
题目地址:点我


一开始没啥思路,搜了一下,找到了一个 http 头 x-forwarded-for
验证本地登录,抓包构造 x-forwarded-for=127.0.0.1,post 走起
ok~
(得抽点时间再好好看看 HTTP 协议了)


Header

头啊!!头啊!!!
传送门: 点我咯


既然提示”头”,抓包咯
flag 就在响应头里~


上传绕过

题目地址:猜猜代码怎么写的


不传照片后缀的提示”不被允许的文件类型,仅支持上传 jpg,gif,png 后缀的文件”
传了照片后缀的又提示”必须上传成后缀名为 php 的文件才行啊!”
不太会,留着以后填坑~


SQL 注入 1

听说你也会注入?
地址: 题目地址


看一下 source

<?php
if($_POST[user] && $_POST[pass]) {
    mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
  mysql_select_db(SAE_MYSQL_DB);
  $user = trim($_POST[user]);
  $pass = md5(trim($_POST[pass]));
  $sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";
    echo '</br>'.$sql;
  $query = mysql_fetch_array(mysql_query($sql));
  if($query[user]=="admin") {
      echo "<p>Logged in! flag:******************** </p>";
  }
  if($query[user] != "admin") {
    echo("<p>You are not admin!</p>");
  }
}
echo $query[user];
?>

代码的意思就是 post user 与 pass,然后提交 post 的 user 必须是 admin.但是密码不知道,所以就得在 $sql=这句想办法绕过 and (pw='".$pass."') 这段
所以构造的语句就是这样
admin’)#
验证一下对不对.这时 $sql 就是

"select user from ctf where (user='admin')#."') and (pw='".$pass."')"

"select user from ctf where (user='admin')

搞定~


pass check

核心源码

<?php
$pass=@$_POST['pass'];
$pass1=***********;//被隐藏起来的密码
if(isset($pass))
{
if(@!strcmp($pass,$pass1)){
echo "flag:nctf{*}";
}else{
echo "the pass is wrong!";
}
}else{
echo "please input pass!";
}
?>

题目链接:tip:strcmp(array,string)=null=0


提示已经很明显了,传一个 pass 数组就行了


起名字真难

地址:代码如下

<?php
 function noother_says_correct($number)
{
        $one = ord('1');
        $nine = ord('9');
        for ($i = 0; $i < strlen($number); $i++)
        {   
                $digit = ord($number{$i});
                if ( ($digit >= $one) && ($digit <= $nine) )
                {
                        return false;
                }
        }
           return $number == '54975581388';
}
$flag='*******';
if(noother_says_correct($_GET['key']))
    echo $flag;
else
    echo 'access denied';
?>

函数里进行 2 次判断
1.key 里是否为存在数字
2.key 是否==’54975581388’

我们知道,php 在判断==时,其中的一个字符串是 0x 开头的时候,会将此字符串解析成为十进制然后再进行比较.恰好 54975581388 的 16 进制是 ccccccccc,没有数字.提交 0xccccccccc 就行了~


密码重置

重置管理员账号:admin 的密码

你在点击忘记密码之后 你的邮箱收到了这么一封重置密码的邮件:

点击此链接重置您的密码


注意 url 的 base64 是 ctfuser,所以改包的时候 post 的 url 也要改成 YWRtaW4=,再把 user 改为 admin 就行了~


php 反序列化

http://115.28.150.176/php1/index.php
代码:

<?php
class just4fun {
    var $enter;
    var $secret;
}

if (isset($_GET['pass'])) {
    $pass = $_GET['pass'];

    if(get_magic_quotes_gpc()){
        $pass=stripslashes($pass);
    }

    $o = unserialize($pass);

    if ($o) {
        $o->secret = "*";
        if ($o->secret === $o->enter)
            echo "Congratulation! Here is my secret: ".$o->secret;
        else
            echo "Oh no... You can't fool me";
    }
    else echo "are you trolling?";
}
?>

不太会,留着以后填坑~


sql injection 4

继续注入吧~
题目地址

TIP:反斜杠可以用来转义
仔细查看相关函数的用法


源码

#GOAL: login as admin,then get the flag;
error_reporting(0);
require 'db.inc.php';

function clean($str){
    if(get_magic_quotes_gpc()){
        $str=stripslashes($str);
    }
    return htmlentities($str, ENT_QUOTES);
}

$username = @clean((string)$_GET['username']);
$password = @clean((string)$_GET['password']);

$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
$result=mysql_query($query);
if(!$result || mysql_num_rows($result) < 1){
    die('Invalid password!');
}

echo $flag;

本来想跳过 pass 的,但是使用了 htmlentities()函数,所以这个方法不可行.试试看插入 or 1=1
整理过程

'SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
SELECT * FROM users WHERE name=\'$username\' AND pass=\'$password\';

如果试图注释掉 pass
SELECT * FROM users WHERE name=\'admin#\' AND pass=\'$password\';
即
SELECT * FROM users WHERE name=\'admin
不可行(因为存在 htmlentities()函数)

如果试图插入 or 1=1
那么应使
name=\'$username\' AND pass=\'(php 中)
name='$username' AND pass='(sql 中)
而 $username 后有个'会使得前面的'闭合,通过添加\可使原来的\'变为\\',使得转义'失效(php 中).即\'\\' AND pass=\'.即'\' AND pass='.此时 name='\' AND pass='
那么 $password 就是 or 1=1#
所以
post 的语句为?username=\&password=or 1=1%23
php 中的语句为 SELECT * FROM users WHERE name='\' AND pass='or 1=1#';
sql 中的语句为 SELECT * FROM users WHERE name='\' AND pass=' or 1=1

得 flag


综合题

题目地址:tip:bash


一坨符号,jsfuck 无疑.我还记得上次复制 jsfuck 的时候没去源码复制,导致复制不全.这次我可留心眼了.跑去源码复制,丢进 firebug.


woc?…
一顿折腾,发现直接在页面复制才可以运行


…有毒啊

打开看看
在响应头里发现了

tip:history of bash

那就打开.bash_history 看看咯

zip -r flagbak.zip ./*

下载,解压,有个 flag.txt.ok~


SQL 注入 2

注入第二题~~主要考察 union 查询
传送门:点我带你飞


<?php
if($_POST[user] && $_POST[pass]) {
   mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
  mysql_select_db(SAE_MYSQL_DB);
  $user = $_POST[user];
  $pass = md5($_POST[pass]);
  $query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
  if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
      echo "<p>Logged in! Key: ntcf{**************} </p>";
  }
  else {
    echo("<p>Log in failure!</p>");
  }
}
?>

可以看到,我们从数据库取出的 pw 要和我们输入的 pass 经过 md5()后相等.由于不知道 pw 的值,所以就不能用 where user=admin 这个语句来取,所以这个 where 必须为假.

select pw from ctf where user=admin and 1=2

而又要取出 pw,所以利用 union 可以这么构造

select pw from ctf where user=admin and 1=2 union select md5(1)

既然取出的 pw 是 1 的 md5 值,那么在提交 pass 的时候就为 1

所以 username=admin’ and 1=2 union select md5(1)#
password=1

ok~


综合题 2

非 xss 题 但是欢迎留言~
地址:get the flag


不会,留着以后填坑


注入实战 1

请使用 firefox 浏览器,并安装 hackbar 插件(自行百度并熟悉)
目标网址:地址
flag 为管理员密码的 32 位 md5(小写)
并且加上 nctf{}

手注教程群里面发过。
看不懂的话自行百度”mysql 手动注入”查阅相关文章

PS:用 sqlmap 等工具做的就不要厚脸皮提交了


网站貌似出问题了,页面一直显示不了,先放着吧


密码重置 2

题题被秒,当时我就不乐意了!
本题来源于 CUMT
题目链接

TIPS:
1.管理员邮箱观察一下就可以找到
2.linux 下一般使用 vi 编辑器,并且异常退出会留下备份文件
3.弱类型 bypass


提示 1 说邮箱很容易找到,看了一下源码:admin@nuptzj.cn
提示 2 说 vim 异常退出留下备份文件.搜了一下,发现

目前主要的编辑器都有恢复功能,vim 也不例外。vim 是通过“保存”文件来挽回数据的。每当我们在用 vim 编辑时,vim 都会自动在被编辑的文件的目录下面再新建一个名为 filename.swp 的文件。这就是一个暂存文件,我们对文件 filename 所做的操作都会被记录到这个文件当中。如果系统意外崩溃,导致文件没有正常保存,那么这个暂存文件就会发挥作用。

所以,应该存在一个.swp 的文件.而 get 的 action 是 submit.php,所以应该构造.submit.php.swp
访问之

........这一行是省略的代码........

/*
如果登录邮箱地址不是管理员则 die()
数据库结构

--
-- 表的结构 `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `token` int(255) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

--
-- 转存表中的数据 `user`
--

INSERT INTO `user` (`id`, `username`, `email`, `token`) VALUES
(1, '****不可见***', '***不可见***', 0);
*/


........这一行是省略的代码........

if(!empty($token)&&!empty($emailAddress)){
    if(strlen($token)!=10) die('fail');
    if($token!='0') die('fail');
    $sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'";
    $r = mysql_query($sql) or die('db error');
    $r = mysql_fetch_assoc($r);
    $r = $r['num'];
    if($r>0){
        echo $flag;
    }else{
        echo "失败了呀";
    }
}


代码要求 token 的长度为 10 且 token 的值是 0,那么提交 0e00000000 就行啦~


隐写术

女神

听说这是女神的私房照,里面藏着 flag 哦
http://115.28.150.176/misc1.jpg


用 notepad 打开就能看见了~


图种

flag 是动态图最后一句话的拼音首字母
加上 nctf{}


既然是图种,解压看看

播放的好慢….用 firework 打开直接看最后一张


丘比龙 De 女神

丘比龙是丘比特的弟弟,由于吃了太多的甜甜圈导致他飞不动了!

没错 里面隐藏了一张女神的照片
flag 是照片文件的 md5 值(小写)
记住加上 flag{}


用 notepad 打开,发现了”nvshen.jpg”..估计又是图种.可是解压后发现

winhex 打开看看
搜”nvshen”,发现”love”.哪有与原无故的 love.估计这压缩还有密码

与此同时

啧啧.zip 没跑了

但是 zip 的头是 50 4B 03 04,这里没有,加上就行了.把前面的 6C 6F 76 65 一直到文件末尾抓到一个新的文件去,再把 6C 6F 76 65 换为 50 4B 03 04,解压

love~ok~

(话说 flag 的格式由 nctf{}变成 flag{}真的好吗…)

顺便安利一篇讲解 zip 的文章(http://www.cnblogs.com/test404/p/5979110.html)


密码学

easy!

密文:bmN0Znt0aGlzX2lzX2Jhc2U2NF9lbmNvZGV9
这题做不出来就剁手吧!


base64~


KeyBoard

看键盘看键盘看键盘!
答案非标准格式,提交前加上 nctf{}
ytfvbhn tgbgy hjuygbn yhnmki tgvhn uygbnjm uygbn yhnijm


看着键盘画一下就行了~


base64 全家桶

全家桶全家桶全家桶!
我怎么饿了。。。。。。
密文(解密前删除回车):R1pDVE1NWlhHUTNETU4yQ0dZWkRNTUpYR00zREtNWldHTTJES
1JSV0dJM0RDTlpUR1kyVEdNWlRHSTJVTU5SUkdaQ1RNTkJWSVk
zREVOUlJHNFpUTU5KVEdFWlRNTjJF


全家桶…base64,base32,base16.

import base64
print base64.b16decode(base64.b32decode(base64.b64decode('R1pDVE1NWlhHUTNETU4yQ0dZWkRNTUpYR00zREtNWldHTTJES1JSV0dJM0RDTlpUR1kyVEdNWlRHSTJVTU5SUkdaQ1RNTkJWSVkzREVOUlJHNFpUTU5KVEdFWlRNTjJF')))


n 次 base64

依然是 base64
不过。。。编码次数有点多
请用 python 解吧~
地址:密文地址


#s 就是密文
import base64
while 1:
    s=base64.b64decode(s)
    print s

加密函数

<?php   
function encode($str){  
    $_o=strrev($str);  
    for($_0=0;$_0<strlen($_o);$_0++){  
        $_c=substr($_o,$_0,1);  
        $__=ord($_c)+1;  
        $_c=chr($__);  
        $_=$_.$_c;  
    }  
    return str_rot13(strrev(base64_encode($_)));  
}  
?>

那么写解密函数就行了

<?php
function decode($str)
{  
    $str=base64_decode(strrev(str_rot13($str)));
    $_o=strrev($str);  
    for($_0=0;$_0<strlen($_o);$_0++)
    {  
        $_c=substr($_o,$_0,1);  
        $__=ord($_c)-1;  
        $_c=chr($__);  
        $_=$_.$_c;  
    }  
    return $_;  
}  
$string='iEJqak3pjIaZ0NzLiITLwWTqzqGAtW2oyOTq1A3pzqas';  
echo decode($string);
?>

mixed_base64

多重 base64 加密,
干(sang)得(xin)漂(bing)亮(kuang)!

code.txt


也就是随机从 base64,32,16 里选一个加密,反复 10 次.那只能爆破了,python 大法好

from base64 import *
import itertools
s=open('1.txt','r').read()
result={
    '16':lambda x:b16decode(x),
    '32':lambda x:b32decode(x),
    '64':lambda x:b64decode(x)
    }
for i_1 in ['16','32','64']:
    for i_2 in ['16','32','64']:
        for i_3 in ['16','32','64']:
            for i_4 in ['16','32','64']:
                for i_5 in ['16','32','64']:
                    for i_6 in ['16','32','64']:
                        for i_7 in ['16','32','64']:
                            for i_8 in ['16','32','64']:
                                for i_9 in ['16','32','64']:
                                    for i_10 in ['16','32','64']:
                                        try:
                                            print result[i_10](result[i_9](result[i_8](result[i_7](result[i_6](result[i_5](result[i_4](result[i_3](result[i_2](result[i_1](s))))))))))
                                        except:
                                            continue

大概跑个 10 秒就出了~顺序是[32 16 16 64 16 64 32 16 32 32]


异性相吸

同性真爱,异性相吸都是假的!
(题目要求,我是直的)

解密压缩文件里的内容

TIPS:
1.xor
2.hex2binary
3.len(bin(miwen))==len(bin(mingwen))

文件


按照 tips,写个 python 跑啦~

ens=open('en.txt','r').read()#密文
des=open('de.txt','r').read()#明文
for i in range(len(des)):
    print chr(ord(des[i])^ord(ens[i])),

MD5

python 大法好!
这里有一段丢失的 md5 密文
e9032???da???08????911513?0???a2
要求你还原出他并且加上 nctf{}提交

已知线索 明文为: TASC?O3RJMV?WDJKX?ZM

题目来源:安恒杯


要做的就是把?补出来.python 大法还是好~

import hashlib   
for i in range(32,127):
    for j in range(32,127):
        for k in range(32,127):
            m=hashlib.md5()
            m.update('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM')
            des=m.hexdigest()
            if 'e9032' in des and 'da' in des and '911513' in des:
                print des

原文是 TASCJO3RJMVKWDJKXLZM


Vigenere
300

It is said that Vigenere cipher does not achieve the perfect secrecy actually :-)
Tips:
1.The encode pragram is given;
2.Do u no index of coincidence ?
3.The key is last 6 words of the plain text(with “nctf{}” when submitted, also without any interpunction)

code is here(without ‘
‘):
F96DE8C227A259C87EE1DA2AED57C93FE5DA36ED4EC87EF2C63AAE5B9A7EFFD673BE4ACF7BE8923CAB1ECE7AF2
DA3DA44FCF7AE29235A24C963FF0DF3CA3599A70E5DA36BF1ECE77F8DC34BE129A6CF4D126BF5B9A7CFEDF3EB8
50D37CF0C63AA2509A76FF9227A55B9A6FE3D720A850D97AB1DD35ED5FCE6BF0D138A84CC931B1F121B44ECE70F
6C032BD56C33FF9D320ED5CDF7AFF9226BE5BDE3FF7DD21ED56CF71F5C036A94D963FF8D473A351CE3FE5DA3CB
84DDB71F5C17FED51DC3FE8D732BF4D963FF3C727ED4AC87EF5DB27A451D47EFD9230BF47CA6BFEC12ABE4ADF7
2E29224A84CDF3FF5D720A459D47AF59232A35A9A7AE7D33FB85FCE7AF5923AA31EDB3FF7D33ABF52C33FF0D673A
551D93FFCD33DA35BC831B1F43CBF1EDF67F0DF23A15B963FE5DA36ED68D378F4DC36BF5B9A7AFFD121B44ECE76
FEDC73BE5DD27AFCD773BA5FC93FE5DA3CB859D26BB1C63CED5CDF3FE2D730B84CDF3FF7DD21ED5ADF7CF0D63
6BE1EDB79E5D721ED57CE3FE6D320ED57D469F4DC27A85A963FF3C727ED49DF3FFFDD24ED55D470E69E73AC50DE
3FE5DA3ABE1EDF67F4C030A44DDF3FF5D73EA250C96BE3D327A84D963FE5DA32B91ED36BB1D132A31ED87AB1D021
A255DF71B1C436BF479A7AF0C13AA14794

encode.cpp
code.txt


先判断 key 长度: 由于 key 是重复使用的, 所以寻找密文里重复的字, 就可以判断 key 的长度(7 位)
由于 key 有 7 位, 每位都有 256 种可能性, 一共是 256**7.
但是如果逐位确定的话, 只需要 256*7



# -*- coding: cp936 -*-
import re,pprint
from Crypto.Util import strxor

C = 'F96DE8C227A259C87EE1DA2AED57C93FE5DA36ED4EC87EF2C63AAE5B9A7EFFD673BE4ACF7BE8923CAB1ECE7AF2DA3DA44FCF7AE29235A24C963FF0DF3CA3599A70E5DA36BF1ECE77F8DC34BE129A6CF4D126BF5B9A7CFEDF3EB850D37CF0C63AA2509A76FF9227A55B9A6FE3D720A850D97AB1DD35ED5FCE6BF0D138A84CC931B1F121B44ECE70F6C032BD56C33FF9D320ED5CDF7AFF9226BE5BDE3FF7DD21ED56CF71F5C036A94D963FF8D473A351CE3FE5DA3CB84DDB71F5C17FED51DC3FE8D732BF4D963FF3C727ED4AC87EF5DB27A451D47EFD9230BF47CA6BFEC12ABE4ADF72E29224A84CDF3FF5D720A459D47AF59232A35A9A7AE7D33FB85FCE7AF5923AA31EDB3FF7D33ABF52C33FF0D673A551D93FFCD33DA35BC831B1F43CBF1EDF67F0DF23A15B963FE5DA36ED68D378F4DC36BF5B9A7AFFD121B44ECE76FEDC73BE5DD27AFCD773BA5FC93FE5DA3CB859D26BB1C63CED5CDF3FE2D730B84CDF3FF7DD21ED5ADF7CF0D636BE1EDB79E5D721ED57CE3FE6D320ED57D469F4DC27A85A963FF3C727ED49DF3FFFDD24ED55D470E69E73AC50DE3FE5DA3ABE1EDF67F4C030A44DDF3FF5D73EA250C96BE3D327A84D963FE5DA32B91ED36BB1D132A31ED87AB1D021A255DF71B1C436BF479A7AF0C13AA14794'

gcd = []
for z in set(re.findall(r'(.{2})',C)): #2 个一组
    loc = [0]+[s.start() for s in re.finditer(z, C)]
    gcd += [j-i for i,j in zip(loc,loc[1:])]


#分别计算能被 1-14 整除的距离数
pprint.pprint(sorted([(j,i) for (i,j) in [[i, sum([j for j in gcd if j%i==0 and j])] for i in range(1,14)]], reverse = True))

#7 较难被整除, 在结果里却排名靠前, 说明 Keylen 很有可能是 7
Keylen = 7
Key = ['*'] * Keylen

#14 个一组
Csplit = [re.findall(r'(.{2})',z) for z in re.findall(r'(.{'+str(Keylen*2)+'})',C)]
#转置
Transpose = map(list,[zip(*Csplit)])[0]

for i in range(Keylen):
    m = 0
    for k in range(255):
        #统计字母, 标点个数
        score = len(re.findall(r'[a-zA-Z ,\.;?!:]',''.join([strxor.strxor(c.decode('hex'), chr(k)) for c in Transpose[i]])))
        if m < score:
            m = score
            Key[i] = chr(k).encode('hex')

print 'Key:',''.join(Key)
Key = str(''.join(Key).decode('hex'))*100
print 'M:',strxor.strxor(Key[:len(C.decode('hex'))],C.decode('hex'))

[(98697, 1),
 (66734, 2),
 (55167, 7),
 (35216, 4),
 (28794, 3),
 (19875, 5),
 (18882, 6),
 (16552, 8),
 (12970, 10),
 (10488, 12),
 (8998, 11),
 (8955, 9),
 (6539, 13)]
Key: ba1f91b253cd3e
M: Cryptography is the practice and study of techniques for, among other things, secure communication in the presence of attackers. Cryptography has been used for hundreds, if not thousands, of years, but traditional cryptosystems were designed and evaluated in a fairly ad hoc manner. For example, the Vigenere encryption scheme was thought to be secure for decades after it was invented, but we now know, and this exercise demonstrates, that it can be broken very easily.

MISC

放着以后填坑~

逆向

放着以后填坑~

pwn

放着以后填坑~

结束

End

What do you think?

本文标题: 南邮网络攻防训练
原始链接: http://www.tr0y.wang/2016/09/26/NyouCTF/
发布时间: 2016.09.26-09:26
最后更新: 2019.05.31-16:36
版权声明: 本站文章均采用CC BY-NC-SA 4.0协议进行许可。转载请注明出处!