风の愿

使用 rsync (cwRsync Server) 同步 Windows 上的文件

rsync 是一个 UNIX 下很流行的命令行同步工具。rsync 有两种工作模式,一种是 rsync 自己作为一个服务端运行监听客户端的同步请求,另一种是基于 SSH 直接进行同步(即 rsync over SSH)。我比较喜欢第二种模式,因为第二种模式下它可以使用公钥登录不需要每次都输入密码,进一步提高了自动化程度,另外它还可以同步任意路径不需要提前指定。

这篇文章将介绍使用 rsync over SSH 对 Windows 系统进行文件同步。使用命令行工具最大的好处在于一次性配置之后(即编写命令行脚本)可以非常轻松地重复操作。键盘上按回车就可以进行同步,这可比重复进行【远程连接 -> 打开挂载的分区 -> 复制 -> 粘贴】要快捷多了。

Read More »
Published @ 21st October, 2016

2016 · 面试季

不知不觉到了要正式地找一份实习的年龄了。作为一个有追求的 Web 狗(所谓手上写着 JavaScript 但心里想念着 C++),只给 Google Shanghai 和 Microsoft Shanghai 投了研发实习的简历。

我虽然有信息学奥赛获奖背景,但一直以来 Web 相关的工程开发才是我的强项,因此我的经历也许对同类同学有一些参考价值,希望可以帮助到大家 :-)

Read More »
Published @ 02nd May, 2016

0CTF 2016 Quals - rand 2 Writeup

Challenge

<?php
include('config.php');
session_start();

if($_SESSION['time'] && time() - $_SESSION['time'] > 60) {
    session_destroy();
    die('timeout');
} else {
    $_SESSION['time'] = time();
}

echo rand();
if (isset($_GET['go'])) {
    $_SESSION['rand'] = array();
    $i = 5;
    $d = '';
    while($i--){
        $r = (string)rand();
        $_SESSION['rand'][] = $r;
        $d .= $r;
    }
    echo md5($d);
} else if (isset($_GET['check'])) {
    if ($_GET['check'] === $_SESSION['rand']) {
        echo $flag;
    } else {
        echo 'die';
        session_destroy();
    }
} else {
    show_source(__FILE__);
}

Solve

Obviously, we need to predict the 5 random number generated in ?go and submit it via ?check[]=num1&check[]=num2&check[]=num3&check[]=num4&check[]=num5 to get the flag.

We know that rand() is a PRNG and for a fixed seed it will generate exactly the same random number sequence. In other words, the number from rand() is decided if we give the seed and know how much rand() calls has been made before this call (the index in the sequence).

Thus in order to predict the random number, we seperate the challenge into two parts:

  1. Assume that the outputed rand() is the first number in the sequence and we search the seed so that the first number of the sequence is the number we got from the page.

  2. Enforce the creation of PHP process so that the outputed rand() we got is indeed the first number in the sequence.

Read More »
Published @ 16th March, 2016

npm 混合公共仓库和私有仓库

需求

  1. 私有包托管在内部服务器中

  2. 项目中使用了公共仓库上的公共包,也使用了内部服务器上的私有包

  3. 希望下载的时候,公共包走公共仓库,私有包走内部服务器的私有仓库

解决

可以借助 npm 的 scoped package 功能,并配上 cnpmjs.org 搭建私有仓库,来解决上述需求。

Read More »
Published @ 16th February, 2016

HSTS

强制使用 HTTPS 一定能保障网站安全吗?并不是。虽然中间人在 HTTPS 协议下会被发现,然而中间人还可以阻止用户使用 HTTPS,强制使用不安全的 HTTP 从而截获和篡改流量,即使服务端只允许 HTTPS 也无法完全避免该攻击。

原理很简单,用户在浏览器中输入地址时,大多数时候是不包含 https: 的,也就是初始访问很可能是 http: 。中间人此时只需屏蔽服务端发送的 HTTPS 重定向 header (例如 location: https://example.com),并修改响应主体中的 HTTPS 地址到 HTTP,最后以 HTTP 方式继续和客户端交互数据就可以了。对于客户端来说,它以 HTTP 和中间人通信;对于中间人来说,它以 HTTPS 和服务端通信,因此服务端无法防御此类攻击。没有专业知识的客户端一般不会留意非 HTTP 通信,因此这种攻击往往很有效。

该攻击叫做 SSL stripping,具体可参见该演讲:https://www.youtube.com/watch?v=MFol6IMbZ7Y

HSTS 机制可以一定程度上降低该攻击风险,提高安全性。HSTS 是一个 header,告诉浏览器未来该域名(或该域名和子域名)的访问一律使用 HTTPS 协议。浏览器一旦收到 HSTS header,那么在有效时间内,域名下的后续请求都会强制使用 HTTPS,从而避免了后续访问中的 SSL stripping 攻击。

Read More »
Published @ 19th August, 2015

AVX2 Optimized Alpha Blend

AVX2 is a new SIMD instruction set introduced in Intel(R) Haswell in 2013. It can calculate on 256-bit vectors. Ideally you can get ~2x performance boost by switching to AVX2 from SSE.

However AVX2 has two lanes and a set of AVX2 permutations are applied to high and low 128 bit parts separately, so if you just replace SSE instructions with AVX2 instructions and xmm with ymm you will not get a correct result.

Here I wrote a sample of using AVX2 to accelerate the calculation of alpha blend.

// some pre-calculations
void alpha_blend_init()
{
  __declspec(align(32)) uint32_t shuffle[] = { 0xFF06FF06, 0xFF06FF06, 0xFF0EFF0E, 0xFF0EFF0E };
  uint32_t * p_shuffle = &shuffle[0];

  __asm {
    VZEROALL;
    MOV ECX, 0x100;
    VMOVD xmm6, ECX;
    VPBROADCASTW ymm6, xmm6;
    MOV ECX, p_shuffle;
    VMOVDQA xmm5, [ECX];
    VPERM2I128 ymm5, ymm5, ymm5, 0
  }
}

// calculate 4 pixel at a time
void alpha_blend(uint32_t * back4px, uint32_t * fore4px, uint32_t * out4px)
{
  __asm {
    MOV EBX, back4px;
    VMOVDQA xmm0, [EBX];
    MOV ECX, fore4px;
    VMOVDQA xmm1, [ECX];
    VPERMQ ymm0, ymm0, 0xDC;
    VPERMQ ymm1, ymm1, 0xDC;
    VPUNPCKLBW ymm0, ymm0, ymm7;  // ymm0 = back
    VPUNPCKLBW ymm1, ymm1, ymm7;  // ymm1 = fore
    VPSHUFB ymm2, ymm1, ymm5;     // ymm2 = alpha(fore)
    VPSUBW ymm3, ymm6, ymm2;      // ymm3 = 256 - alpha
    VPMULLW ymm1, ymm1, ymm2;     // ymm1 = fore * alpha
    VPMULLW ymm0, ymm0, ymm3;     // ymm0 = back * (256 - alpha)
    VPADDW ymm0, ymm0, ymm1;
    VPSRLW ymm0, ymm0, 8;
    VPACKUSWB ymm1, ymm7, ymm0;
    VPERMQ ymm1, ymm1, 0x0D;
    MOV ECX, out4px;
    VMOVDQA [ECX], xmm1;
  }
}

The code is based on the following alpha blend formula, assuming that we are going to blend a image containing Alpha channel (A) over a bitmap (B).

C_rgb = ( A_rgb * A_a + B_rgb * (256 - A_a) ) / 256

Read More »
Published @ 26th July, 2015

ALICTF 2015 Writeup

Vijos.org 开发组另两名同学一起去参加了 ALICTF 2015

由于自己和队友们并不是从事信息安全的,并且自己也是第一次参加 CTF (Capture The Flag) 类比赛,所以最初就是想打打酱油混个最低奖项的。结果一不小心进了决赛,还最后拿了三等奖(不过名义上是第三名呢!:-)

虽然并没有渗透经验,决赛时候状态很不好,没有达到预期成果,有点遗憾,不过这次比赛还是有非常多收获的。

由于近几年一直在从事 Web 前后端开发,自初中以来已有很长时间没接触二进制安全了,并且还没有二进制调试环境,因此在初赛和决赛中,我主要负责 Web 安全部分,包括前端和 PHP 后端。

二进制安全方面全部由 PSNull 作者、Vijos NT 作者、Google offer 获得者 iceboy 神队友负责。

Java 相关部分由 blackbbc 完成。

Read More »
Published @ 30th March, 2015

解决 node-gyp rebuild 时的假死问题

最近 npm install 时候经常遇到在 node-gyp rebuild 那里卡很久的情况(大于十分钟),于是研究了一下输出的错误日志解决了这个问题,在这里分享一下。

首先,请检查 node-gyp 需要的 Python 和编译工具链是否已安装:

On Unix:

  • python (v2.7 recommended, v3.x.x is not supported)
  • make
  • A proper C/C++ compiler toolchain, like GCC

如果检查下来这几项都没问题的话,可能是 Node.js 源码缺失的原因。

这其实又是一个天朝独有的问题,主要原因是 node-gyp 编译时候需要 Node.js 源码来提供头文件,所以它会先尝试下载 Node.js 源码;而在天朝墙外 CDN 经常抽风,有时候下载 Node.js 源码奇慢无比,如我这里就只有 3KB/s,那么自然要卡很久。

Read More »
Published @ 14th November, 2014

Animate Button Effect

假期第一天使用 Snap.svg 写了一个有趣的递交按钮。

DEMO 点击按钮可以直接查看效果,第一个会递交成功,第二个会递交失败。

Published @ 01st October, 2014

Cryptography I 第一周作业解题报告

Cryptography I 第一周作业:已知 11 条使用了相同的 Stream Cipher key 加密的密文(cipher text),尝试解出第 11 条的明文(plain text)。

Read More »
Published @ 22nd September, 2014
1 2 3 >