今天通过了七牛的实名,于是倒腾了下,在此记录一下。

由于强迫症,想找出一个好一点的办法来解决问题,于是乎在网上搜来搜去,最后总算倒腾出个勉强满意的方案。

首先七牛的镜像工作过程是:用户在请求七牛中文件时,若七牛有则直接返回,若没有,则请求镜像目标对应文件,存入七牛中并返回,一个bucket只能镜像于一个网址。

而在SAE上使用七牛的CDN加速,关键问题在于,由于SAE不能写入的特点,所有上传的文件是传到了storage里面,也就是说,需要加速的文件同时存在于storage和博客本身目录中,使得七牛的wordpress插件不能完美适应SAE。

最开始是看到网上有人号称改写的SAE版的七牛wordpress插件,结果一试之后大失所望,发现其根本就只加速了storage里面的内容,也不知道是不是我打开方式不正确。。。反正感觉就是不知道他改写了什么,除了把默认设置改了之外。。。

后来还是直接使用了原版的七牛wordpress插件,本来第一想法是,将其安装两份,一份负责加速博客目录里面的,一份负责加速storage里面的,但是这样需要两个七牛的bucket,然后又要改插件里面的配置文件名神马的,还担心每多一个插件,就降低一点速度,觉得不满意。

然后发现网上有config.php里面的常量的,define('SAE_URL', 'http://你的七牛地址/upload'),结果发现自己的里面根本没这个常量,目测版本不同,话说我应该是装的官方提供的那个最新的啊,然后找了下,最后发现在wp-includes里面的functions.php里面有:

1
2
3
// for SAE
$dir = 'saestor://wordpress/uploads';
$url = 'http://' . $_SERVER['HTTP_APPNAME'] . '-wordpress.stor.sinaapp.com/uploads';

看了下应该就是要找的地方,修改$url = 七牛地址/uploads之后,果然再插入附件的时候,自动生成的链接地址是指向七牛的。但是现在还是有几个问题:

  • 还是需要两个七牛的bucket;

  • 所有之前写的文章中的附件地址还需要手动修改,否则不会加速(虽说我博客才开,基本没有要改的)

  • 今后如果不想用七牛了,那么文章中所有附件地址都得改回来;

于是乎最好的办法应该还是对php输出内容替换,继续想办法,既然七牛插件里面是通过正则表达式的替换,那么我在“静态文件域名”中填入正则表达式,使其能够同时匹配博客本地目录和storage目录,那不就可以使得地址全部替换了,可是七牛一个bucket只能镜像一个网址,那么就通过rewrite的方式,使得访问博客目录时能自动重定向到storage中,因为storage中的都是/uploads目录下,于是得到方案如下:

  1. 首先在七牛中新建bucket,设置镜像为wordpress博客的主页;

  2. 然后在七牛插件中设置七牛绑定的域名为刚建的bucket网址(ACCESS KEY、SECRET KEY是为了插件中的文件更新等功能,可不设);

  3. 接着设置七牛插件中的扩展名为 js css png jpg jpeg gif ico zip rar</span>(附件需要什么扩展名自行添加),设置目录为 wp-content wp-includes uploads,静态文件域名设置为http://SAE二级域名(?: -wordpress.stor).sinaapp.com;
  4. 最后在config.yaml(或者通过AppConfig的rewrite)中添加:
1
- rewrite: if ( path == "/(uploads/.*)" ) goto "http://SAE二级域名-wordpress.stor.sinaapp.com/$1";

PS:上述SAE二级域名是指去掉.sinaapp.com之后的。

本来至此就可以完事了,只是强迫症,于是乎决定再把avatar头像也加速了。由于对avatar头像的请求含有GET字符串,即有?,七牛对于这种请求,在访问镜像网站对应内容时,似乎是会忽略?后面的内容,导致得到的头像不对,于是乎,需要临时替换掉?,具体步骤如下:

  • 首先在当前主题的functions.php中加上:
1
2
3
4
5
function cdn_update_avatar($avatar) {
    $regex = '#http://(?:0|1|2|www|en).gravatar.com/([^?]*)?(.*)#';
    return preg_replace ($regex, 'http://七牛bucket网址/$1@$2', $avatar);
}
add_filter('get_avatar', 'cdn_update_avatar');
  • 然后在config.yaml中添加:
1
- rewrite: if ( path == "/avatar/([^@]*)@(.*)" ) goto "http://gravatar.duoshuo.com/avatar/$1?$2"

这样,在七牛的网址中,?被替换成了@,在七牛向博客发出请求后,博客在rewrite的时候会自动把@还原成?,不过如果avatar的网址中含有@目测会挂(不过应该没有吧)。

至此,我们完成了对WordPress for SAE的七牛CDN加速,具体效果可以查看本博客。

PS:由于本博客不需要缩略图,所以没有倒腾七牛的缩略图功能~~~


昨天帮人调的时候遇到的问题,在这里做个说明:

  • 不要勾选“自动将远程图片镜像到七牛”,否则会有问题,现在还没研究这个选项是做了什么,但昨天是出了问题就是了;

  • 对于除了uploads文件夹外,还有多个并行的文件夹的情况,需要首先在第三步中设置目录的时候把相应的目录也增加上去,然后第四步中rewrite也相应的增加上相应目录的rewrite(就是把第四步中给出的rewrite规则中的uploads换成需要的目录名);

  • 对于SAE使用独立域名的情况,将第三步中的静态文件域名设置修改为 http://(?:SAE二级域名(?:|-wordpress.stor).sinaapp.com|SAE的独立域名)


刚帮人调了个问题,在这里再补充说明下:

一定要注意rewrite的顺序,如果不是很懂的可以把上面要加的rewrite写的靠前一点,避免被某些rewrite给拦截导致没生效(比如很多网站会有的重定向到index.php)。

之前为了比赛,在网上做题,后来看到了OverTheWire,感觉不错,就试了下,既然开博客了,就写点题解吧,也方便自己以后回顾,现在先补一篇,剩下的有时间慢慢补。

原题参见这里

1
2
3
4
5
6
7
8
9
10
int main(int argc, char **argv)
{
    char buf[58];
    u_int32_t hi;
    if((hi = crc32(0, argv[1], strlen(argv[1]))) == 0xe1ca95ee) {
        strcpy(buf, argv[1]);
    } else {
        printf("0x%08xn", hi);
    }
}

题目很明确,就是要对上面的代码进行溢出,得到shell。

代码很简洁,先对输入的参数进行crc32,要求得到的值为0xe1ca95ee,然后一句没有长度检查的strcpy很显然就是注入点,strcpy后直接就结束程序了,所以应该是通过溢出覆盖函数返回地址了。

那么,首先要解决的问题就是那个crc32了,上网搜了下(题目的Reading Material中也给了讲解),CRC就是循环冗余码,好吧,没想到这学期计原刚听过的竟然在这里遇到了。循环冗余码很明显是个容易制造冲突的算法,谁叫别个本来就不是专门设计来防恶意篡改的(正所谓防君子不防小人)

关于如何解决CRC算法,在讲解中已经说明的很清楚,大致总结一下就是:对于只知道CRC结果要产生字符串的时候,就是要解决如何在一个已知字符串后面添加一些字符来把其CRC值改变成我们需要的值,因为CRC就是做了个二进制除法(用异或代替了普通的加减法),所以我们只需要能控制被除数末尾的和除数位数相同的位数,就肯定可以随意控制余数,也就是CRC值了,所以解决CRC32只需要在后面增加4个字节(32位)就可以了。确定了增加的位数之后,按照CRC的算法列个方程,求解即可。

后面附件中有我写的python版本的CRC Crack,其中CRC Table也可以选择在网上搜出来直接复制,本人强迫症,所以就自己写了生成。

接下来就是制作payload了,函数返回地址位置好找,gdb一下就可以看到buf和返回地址的位置差了74个字节,接下去的问题就是将返回地址改成什么。最简单的办法,就是利用环境变量,在之前的Level 4 → Level 5中我们就研究过栈空间的分布,环境变量的位置基本就在栈底了,而由于是静态栈,栈底的位置我们很容易得到,那么,我们将shellcode放在环境变量中,避免精确计算,可以加入一些nop,最后将返回值地址指向接近栈底的位置即可。

于是方案如下:

argv[1] = "x90" * 74 + (栈底地址 + 250) + CRC矫正值

env[0] = "x90" * 500 + shellcode

源代码参见附件。

到此,此题已经解决,但由于最开始脑残,总想着把shellcode直接放到argv[1]中,那这样虽然麻烦了点,但也确实是可行的,方法如下:

因为这样我们需要知道buf的准确位置,我尝试通过gdb,set follow-fork-mode child希望跟进子程序,从而获得目标程序被我的程序调用时的栈位置,结果发现在服务器上,gdb跟不进去,fork子程序会失败,于是乎写了个小程序通过同样的方法同样的参数被启动程序调用来获取ebp的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int getebp()
{
    __asm__("pop %eaxn"
            "push %eax");
}

int main(int argc, char *argv[])
{
    unsigned int ebp = getebp();
    printf("%08x", ebp);
}

获取到ebp后,ebp + 0x4就是返回地址的位置了,那么我们只需要将返回地址修改为ebp + 0x8即可。

即:argv[1] = "x90" * 74 + (ebp + 0x8) + shellcode + CRC矫正值。

源代码参见附件。当然,如果担心计算不精确,也可以在shellcode前面加上一些nop,增大命中范围。

PS:我尝试让argv[1] = "x90" * (74 – len(shellcode)) + shellcode + (ebp + 0x8) + CRC矫正值,结果程序崩溃,没能出shell,不知道为何。

总得来说,在前面的题的经验下,这道题并不难,只是在之前完全不了解CRC的情况下,还是要花点时间研究下。

vortex7.zip

由于飞信没有官方的API,但有时候程序中需要短信提醒,通知一下自己或者朋友而已,不想发收费短信,且鉴于本人有强迫症,不想用网上那些个人提供的接口,于是决定开发了这么个接口,方便需要的时候使用。

最近在弄SAE,于是乎就顺便挂了一份到SAE上,方便在任何语言的程序中使用。各位朋友如若放心,可自行使用,但请不要恶意大量请求,避免被SAE禁用。也可在我的GitHub上下载源码(Python)自行使用。

下面是SAE上飞信接口介绍,网址中HTTP可自行换成HTTPS以增强网络传输时的安全性:

(1)飞信接口调用方式

http://sms.jayvic.sinaapp.com/?from=飞信发送方手机号&pswd=飞信发送方登陆密码&to=飞信接收方手机号&msg=飞信内容

接口同时支持GET和POST方式;

发送给自己时,to参数可省略; 

to参数支持用逗号隔开的多个手机号,以方便群发(至于一次最多能发多少人,我没有测试过),eg:to=13900000000,13911111111;

(2)返回结果

返回结果格式为JSON;

发送成功时返回结果为

{"info": "u53d1u9001u6210u529f", "sendCode": "200"}

发送失败时返回结果因失败的原因不同而异;

(3)接口测试

可在浏览器上直接按照格式输入网址访问进行调用测试;

也可以访问测试页面进行测试;

(4)Python调用接口示例

1
2
3
4
import urllib
import urllib2
data = {'from': '13900000000', 'pswd': '123456', 'msg': '测试'}
urllib2.urlopen('http://sms.jayvic.sinaapp.com', urllib.urlencode(data))

最后,各位朋友中如果在使用中发现了什么问题,可以跟我反馈,我会尽量处理。

本接口是基于对wap飞信的分析开发,在此希望飞信不要有事没事就进行升级修改或者说增加验证码,放我们一条生路吧!