2014年7月25日星期五

Linux 下使用backtrace获取程序栈信息

以前调试Linux驱动的时候,知道在kernel里使用dump_stack可以打印出内核栈信息,可以很方便查看函数的调用关系。 现在我才知道glibc也支持获取栈信息,并且有相关的函数:

   #include <execinfo.h>

   int backtrace(void **buffer, int size);

   char **backtrace_symbols(void *const *buffer, int size);

   void backtrace_symbols_fd(void *const *buffer, int size, int fd);

以下是Man里的示例代码

       #include <execinfo.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>

       void
       myfunc3(void)
       {
           int j, nptrs;
       #define SIZE 100
           void *buffer[100];
           char **strings;

           nptrs = backtrace(buffer, SIZE);
           printf("backtrace() returned %d addresses\n", nptrs);

           /* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
              would produce similar output to the following: */

           strings = backtrace_symbols(buffer, nptrs);
           if (strings == NULL) {
               perror("backtrace_symbols");
               exit(EXIT_FAILURE);
           }

           for (j = 0; j < nptrs; j++)
               printf("%s\n", strings[j]);

           free(strings);
       }

       static void   /* "static" means don't export the symbol... */
       myfunc2(void)
       {
           myfunc3();
       }

       void
       myfunc(int ncalls)
       {
           if (ncalls > 1)
               myfunc(ncalls - 1);
           else
               myfunc2();
       }

       int
       main(int argc, char *argv[])
       {
           if (argc != 2) {
               fprintf(stderr, "%s num-calls\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           myfunc(atoi(argv[1]));
           exit(EXIT_SUCCESS);
       }


    编译时要加 -rdynamic 参数,否则只有函数地址,没有函数名
 
    $ gcc -rdynamic prog.c -o prog
    $ ./prog 3
     backtrace() returned 8 addresses
     ./prog(myfunc3+0x5c) [0x80487f0]
     ./prog [0x8048871]
     ./prog(myfunc+0x21) [0x8048894]
     ./prog(myfunc+0x1a) [0x804888d]
     ./prog(myfunc+0x1a) [0x804888d]
     ./prog(main+0x65) [0x80488fb]
     /lib/libc.so.6(__libc_start_main+0xdc) [0xb7e38f9c]
     ./prog [0x8048711]

2014年7月23日星期三

squid 访问google.com出现503错误的解决方法

  最近通过https连接到squid,访问google不太正常,查看日志发现大量的 CONNECT www.google.com:443 出现503错误,并且503出现的概率为80%,换了几个版本的squid 都是一样的情况,怀疑是squid的问题,因为同一台服务器上shadowsocks就没有问题。

  我尝试修改配置文件, 增加 dns_v4_first, 指定tcp_outgoing_address,指定dns_nameserves, 问题依旧。

  查看squid文档, 发现squid连接失败后不会重试

Option Name:connect_retries
Replaces:
Requires:
Default Value:Do not retry failed connections.

于是增加
  connect_retries 3
重启squid, 客户端访问google,观察了一上午, 503错误再也没有了。

2014年7月15日星期二

上大学网公布的中国虚假大学名单2014



转载自真相网, 原文链接 http://dafahao.com/chinese-fake-universities-list-2014.html

真相网2014.7.15】近日,上大学网发布了第三批中国虚假大学名单警示榜,其中包括了60多所,涉及中国19个省市的大学。之前也公布了二批虚假大学名单,请急于求学的学生和家长警惕受骗上当。
这些虚假大学以假仿真,很多听上去像是十分正规的大学,其实都是骗人的,比如说,中国信息科技大学、上海同济医科大学和广东科技管理大学等等。而这份警示榜中的信息都是由热心网友、受骗考生,过往应届高考生家长提供。这让人不禁思考,监管部门到底是干什么的。
上大学网公布的榜单声明说“警示榜中的各种虚假信息均由热心网友、受骗考生或应往届高考生家长提供,经上大学网认真搜集、对比和核实调研后确认,请广大低学历或急需提升文凭的朋友、2014年及今后的广大高考生和家长在高考志愿填报时仔细甄别、不要轻信。”
榜单中包括北京经济管理学院、中国信息科技大学、首都财经管理学院等60所,涉及中国19个省市的大学。这是上大学网对外公布的第三批虚假大学。前两批分别是2013年6月26日发布的《上大学网百所中国虚假大学警示榜》和2013年7月23日发布的《上大学网第二批中国虚假大学警示榜(共50所)》。
在上大学网第一次公布的名单中,有超过七成的虚假大学都号称校区在北京,并往往以“中国”、“首都”、“北京”等词企图混水摸鱼。
“上大学”网负责人表示,分数特别低、又想上大学的孩子,最可能会上假大学的当。“上大学”网发现,很多假大学广告上的学校简介都是抄袭真大学往年的简介。
有媒体评论说,这类假大学仿冒名称、以假乱真,再盗用正牌高校的照片,对高校不甚了解的考生和家长,极有可能信以为真。
附录:
第三批 《上大学网第三批中国虚假大学警示榜(2014年60所)》,为上大学网专家团队在前二批基础上精心研发而成,属于上大学网在2014年全国高考后最新原创首发的大学榜单。

上大学网第三批中国虚假大学警示榜(2014年60所)

第一批 2013年6月26日首发:上大学网百所中国虚假大学警示榜

第二批 2013年7月23日首发:上大学网第二批中国虚假大学警示榜(共50所)

2014年7月9日星期三

通过ssl安全地使用代理服务器

   通常我们使用代理服务器时,浏览器与代理服务器之间的传输都是明文的,虽然https是加密的,但是https会话开始时依然是明文的,例如,https会话开始时浏览器发送的
    CONNECT www.google.com:443 HTTP/1.1
就是明文的,审查者仍然可以知道你访问了什么网站,如果是他们不喜欢的网站,他们就可以阻止你继续访问。

本文教你如何使用ssl保护你与代理服务器之间的连接。


需要的软件

    服务器端squid 2.6以上,编译时开启了--enable-ssl
    chrome/chromium浏览器 加SwitchySharp插件


服务器端配置

   如果你的系统软件仓库中带的squid编译时没有加 --enable-ssl选项,你需要下载squid的源码,添加--enable-ssl选项重新编译


生成证书

  如果你有现成的证书可以直接使用,如果没有,生成一个自签名的证书,命令如下
  openssl genrsa -out server.key  2048
  openssl req -new -x509 -out server.crt -key server.key -days 365


squid 配置

    在配置文件squid.conf中添加
    https_port 8004 cert=/path/to/server.crt key=/path/to/server.key

防火墙需要允许8004的连接
iptables -A INPUT -p tcp --dport 8004 -j ACCEPT


浏览器设置

    到目前为止(2014-07)只有chrome/chromium支持ssl连接到代理服务器,并且只能通过pac配置

新建一个文本文件命名为proxy.pac,添加如下内容

function FindProxyForURL(url, host){
    return "HTTPS your_proxy_server_name:8004";
}

把your_proxy_server_name 替换成你的代理服务器ip或域名

在SwitchySharp中新建一个情景模式,命名为myproxy_ssl,选择自动配置,然后点击导入pac文件,选择你刚才新建的proxy.pac文件,保存

切换到myproxy_ssl,测试代理服务器能否正常连接


证书问题

    如果使用的是自签名的证书,浏览器会报证书错误,把服务器上的server.crt作为信任的根证书导入浏览器的信任列表即可


参考来源
http://wiki.squid-cache.org/Features/HTTPS
http://dev.chromium.org/developers/design-documents/secure-web-proxy

2014年7月8日星期二

使用混淆之后的ssh连接vps

gfw对ssh的干扰严重到正常的远程管理都受到了影响,把ssh运行在3389,443端口都无济于事。
通过google我发现了两种解决方案:
1.使用obfsproxy
2.使用obfuscated-openssh

obfsproxy是tor项目的,根据google的结果,目前已经阵亡,于是我使用第二种方案。

服务端安装方法
 git clone https://github.com/brl/obfuscated-openssh.git
 cd obfuscated-openssh

  自定义安装位置, 启用md5和pam支持
 ./configure --prefix=/home/dingjun/openssh-obfs --with-md5-passwords --with-pam --with-pid-dir=/home/dingjun/openssh-obfs/var/run --with-privsep-path=/home/dingjun/openssh-obfs/var/empty
 make 
 make install

配置
修改openssh-obfs/etc/sshd_config文件加入如下配置


ObfuscatedPort 8009  # 监听端口
ObfuscateKeyword  wfgkcuf  # 混淆使用的keyword


启动

sudo /home/dingjun/openssh-obfs/sbin/sshd


客户端

windows 下使用potty, potty是打了混淆补丁的putty,下载地址
http://www.mrhinkydink.com/potty.htm

运行potty.exe, 界面和putty一模一样的

在ssh选项里选中 Enable key exchange obfuscation, 然后输入服务器上配置的ObfuscateKeyword

现在就可以使用了
使用cat /var/log/message 测试一下,连接没有被断开