Monday, April 27, 2009

Srun3000 客户端分析的补充

先把后来补充的帖子贴上

时间差的校正
[url]http://www.bitunion.org/redirect.php?goto=findpost&ptid=10141437&pid=8570527[/url]


关于 3L的 FFFF57b4 这个数字
刚才咨询过 srun的技术总监
得到的答复是,在第一次使用客户端的时候,会和服务器进行一次额外通信
然后会有个双向误差校正的过程

这个数据存在注册表的 HKEY_CURRENT_USER\Software\srun3000\login 下的 time_diff里


然后来个人帮忙解决那个时间的问题吧

更新:

由于客户端的信息,存放在注册表中
刚才清空了注册表,进行了一次客户端的全过程抓包

1 登陆 密码错误,原因是时间不对,服务器的返回值为 password_error@TIMESTAMP 后边的 TIMESTAMP是服务器的unix timestamp,形如1240749982
2 本地时间纠正 用服务器的时间减去本地的时间,然后算出时间差,用某种形式存放在注册表里,就跟上边的那个诡异数字似的
3 新登陆 (int)(本地时间+时间差)60; 作为key

。。。。。。。

========================我是分割线=======================


基本时间差的算法就这样了
分钟级的校验,应该还是能接受的,就差传输安全了
但是比较不太舒服的是,新的版本,增加了一些东西,暂时没明白什么意思
大概 http 响应的数据包含三部分
(Code in hex)\r\ndata[\r\n[some other stuff]]
code in hex 大概是 1到两个字节的 16进制字符,估计是通信协议里的一些事件编码
最后一个 someother stuff 是在登陆的时候看到的
一开始没仔细看
周日去良乡,小范围讲了下调试这个客户端的一些东西,现场抓包,才看到的

Saturday, April 25, 2009

[搬移]Srun 3000 加密函数key的分析记录

原文在: http://www.bitunion.org/redirect.php?goto=findpost&ptid=10141437&pid=8567446
外网用 cnc.bitunion.org 或 kiss.bitunion.org
直接拿过来,改动一下格式而已

00404411   > \8B2D BC834000 MOV EBP,DWORD PTR DS:[<&MSVCRT.time>]    ;  msvcrt.time
00404417 . 8D5424 28 LEA EDX,DWORD PTR SS:[ESP+28]
0040441B . 52 PUSH EDX ; /timer
0040441C . FFD5 CALL EBP ; \time

0040441E . 8B4C24 2C MOV ECX,DWORD PTR SS:[ESP+2C]
00404422 . 8B56 60 MOV EDX,DWORD PTR DS:[ESI+60]
00404425 . 33C0 XOR EAX,EAX
00404427 . 2BCA SUB ECX,EDX

00404429 . 894424 34 MOV DWORD PTR SS:[ESP+34],EAX
0040442D . 894424 38 MOV DWORD PTR SS:[ESP+38],EAX
00404431 . 894424 3C MOV DWORD PTR SS:[ESP+3C],EAX
00404435 . 66:894424 40 MOV WORD PTR SS:[ESP+40],AX
0040443A . B8 89888888 MOV EAX,88888889
0040443F . F7E1 MUL ECX
00404441 . C1EA 05 SHR EDX,5
00404444 . 52 PUSH EDX ; /<%u> = 13B873A (20678458.)
00404445 . 8D5424 38 LEA EDX,DWORD PTR SS:[ESP+38] ; |
00404449 . 68 F8B34000 PUSH srun3000.0040B3F8 ; |%u
0040444E . 52 PUSH EDX ; |s
0040444F . FF15 E0834000 CALL DWORD PTR DS:[<&MSVCRT.sprintf>] ; \sprintf



到 0040441C 这行,是实现对 time()函数的调用
返回的值在 EAX存放的是 timestamp,如 49F30B07 十进制表示的 1240664839
EDX的数据是清空了的
ECX的数据是堆栈中这个时间戳的地址,调试的时候,返回的是 00cdfa00,在堆栈段里,

00CDFA00   49F30B07


后边的算法
0040441E . 8B4C24 2C MOV ECX,DWORD PTR SS:[ESP+2C]
这行是把刚才那个堆栈里那个数据复制到ecx里
于是这个操作之后,eax和ecx都是刚才time()返回的timestamp了

DWORD PTR DS:[ESI+60] 是一个 FFFF57b4的数
下边清空 eax
然后 sub ecx, edx
结果 ecx的数据成了 49F3B353
只有后4位进行了减法运算

00404429   .  894424 34     MOV DWORD PTR SS:[ESP+34],EAX
0040442D . 894424 38 MOV DWORD PTR SS:[ESP+38],EAX
00404431 . 894424 3C MOV DWORD PTR SS:[ESP+3C],EAX
00404435 . 66:894424 40 MOV WORD PTR SS:[ESP+40],AX


清空了14字节的堆栈数据
因为之前xor eax, eax清空了eax

然后
0040443A   .  B8 89888888   MOV EAX,88888889
0040443F . F7E1 MUL ECX
00404441 . C1EA 05 SHR EDX,5


一个复制,一个乘法,一个乘法结果高位右移

再最后就把这个数字 sprintf成一个字符串 %u

我就无语了

完全不懂

然后

改动代码,生成的时间串:

 <?php 
$key = strval((time() + 43084)/60);
echo $key;


这个 43084 是刚才那个诡异减法的结果和原始数据的差,其实也就是
0x49F3B353 - 0x49F30B07

于是,这个key就对了

不懂为啥

两边比对了下,OD里的结果和php的输出一样

很好

Srun3000 客户端协议分析

Srun3000的新版终于上线了,之前的内测报了好几个安全漏洞,于是给了一份安全检测报告。结果现在自己想拿都很麻烦了,至少目前还没拿下 XD

然后,说客户端。
目前这个版本的客户端,感觉和上次内测的区别不大,不过至少我提出注册表数据加密之后,srun那边还是做了些工作,虽然那块儿今天没去调。
整体协议还是基于http的,因为还是没有keepalive的设计,所以最关键的就只是登陆的部分。也就是说,登陆的POST串的内容和结构才是我这次最关注的。

直接从客户端的exe文件里就可以提取出这样的字串
username=%s&password=%s&drop=%d&type=2&n=%d&mac=%s
显然,用户名,密码,drop,type=2,n,mac
drop是是否只访问免费资源;type=2是写死的,应该就是表示windows客户端吧,linux的我没看,无所谓;n=7,跟出来的,上个版本是2吧,不记得了,不清楚到底有什么用;mac就不用说了

客户端没有加壳,直接OllyDBG载入
根据字串资源信息,很快地定位到了输入的函数,同时也找到了密码加密函数的入口

我手头这个版本 57,344 字节,加密函数的入口 在 0x00401350。
有许多地方调用了,但是这个不是我关注的,我只需要知道这个算法的内容。

根据push的规则,还原成C的代码,函数声明格式应该是类似
void encrypt(void* pwd_in, void* key,  void* pwd_out);
返回值我不管了,因为没去那边往下跟,无所谓。
中间的几个 void* 具体应该是 unsigned char* 或者 char*,依旧无所谓。

pwd_in 就是密码输入框的内容
key的部分是通过当前系统时间算出来的

关于key的分析可以见我在联盟的帖子
http://www.bitunion.org/redirect.php?goto=findpost&ptid=10141437&pid=8567446
或者
http://kiss.bitunion.org/redirect.php?goto=findpost&ptid=10141437&pid=8567446

稍后考虑也贴过来

算法的部分很简单
两个字符串,一个password,一个key
设password 为 12345678
key为 20678439

逆序循环取key的字符,也就是 9,3,4,8,7,6,0,2,9,3,...
分别与password 的 [0], [1], [2] ... 直到password结束 进行异或运算
对于结果,一个字符

[0],[2],....[2n]的字符,译码之后:(低4位 加上 0x36 )连上 (高4位 加上 0x63)
[1],[3],....[2n+1]的字符,译码之后:(高4位 加上 0x63)连上 (低4位 加上 0x36 )

然后连接之后的结果就是提交的密码的密文
当然,提交的时候,得 实现 urlencode或类似的函数处理这段数据

代码很乱,无所谓了
能改描述清楚问题,并且实现功能就行

Sample Code in PHP:
<?php
$password = '123456';
echo encrypt($password);

function encrypt($password)
{
 $key = strval(floor((time() + 43084)/60));
 return _encrypt($password, $key);
}

function _encrypt($pass, $key)
{
 $pass = substr($pass, 0, 16);
 $len = strlen($pass);
 $ret = '';
 for ($i=0; $i<$len; $i++)
 {
  $_pass = ord($pass[$i]);

  $_key  = _get_keychar($key, $i);

  $_key  = $_key ^ $_pass;
  $ret .= _build_key($_key, $i%2);
 }
 return $ret;
}

function _get_keychar($str_in, $num)
{
 $len = strlen($str_in);
 return ord($str_in[ $len - $num % $len - 1 ]);
}

function _build_key($num, $reverse=0)
{
 $ret = '';
 
 $_low = $num & 0x0f;
 
 $_high = $num >> 4;
 $_high = $_high & 0x0f;
 
 if (!$reverse)
 {
  $ret .= chr($_low  + 0x36);
  $ret .= chr($_high + 0x63);
 }
 else
 {
  $ret .= chr($_high + 0x63);
  $ret .= chr($_low  + 0x36);
 }
 return $ret;
}

Thursday, April 23, 2009

Wine SogouExplorer as a Proxy Server

上一篇相关文章:http://blog.sskaje.name/2009/03/sogou.html
部分细节请翻阅此文


前些天把Ubuntu升级到了 9.04 beta,然后时不时去更新一下
之前企鹅也提出了,能不能在Ubuntu下wine一个sogou explorer来开代理
因为最早的方式是虚拟机和宿主机,用ssh tunnel的方式开代理
后来直接修改了sogounet.dll,把监听地址改成了0.0.0.0,直接对外开放服务

wubi装的ubuntu,直接把分区挂载了,进到sogou explorer的目录
wine配好
直接 ./SogouExplorer.exe 全是乱码
根据印象,把选项选了,然后打开,还是乱码

之前wine baidu hi的时候,配了riched32,当时换成中文环境,就可以正常显示了
结果现在,怎么弄都不成
索性就不考虑字体显示的问题了

直接 ./SogouExplorer.exe -proxy
sskaje@ubuntu:/media/App/Program Files/SogouExplorer$ ./SogouExplorer.exe  -proxy
fixme:mountmgr:harddisk_ioctl unsupported ioctl 74080
fixme:mountmgr:harddisk_ioctl unsupported ioctl 2d1400
fixme:mountmgr:harddisk_ioctl unsupported ioctl 2d0c10
fixme:mountmgr:harddisk_ioctl unsupported ioctl 74080
fixme:mountmgr:harddisk_ioctl unsupported ioctl 2d1400
fixme:mountmgr:harddisk_ioctl unsupported ioctl 2d0c10
PID:21
PORT:8081
CPORT:8082
PAC:http://127.0.0.1:8082/proxy.pac?t=71505
RET:SUCCESS
到这里就挂起了
而且还弹出了一个代理配置错误的msg box,跟之前在windows下一样

sudo netstat -anop | more
看了看,8081端口开了
tcp        0      0 0.0.0.0:8081            0.0.0.0:*               LISTEN      8445/wineserver  关闭 (0.00/0/0)
tcp 0 0 0.0.0.0:8082 0.0.0.0:* LISTEN 8445/wineserver 关闭 (0.00/0/0)

新开一个shell,直接测试
export http_proxy=http://localhost:8081
wget http://www.hackthissite.org/ -O /tmp/1.txt

果然,下载成功

wine下的 regedit 看了看那两个accelerator的选项,都为0
估摸着,这两个选项其实只是对标准的使用方式才有效吧

Wednesday, April 22, 2009

MySQL Show table status 显示行数不准

发现MySQL Administrator的库信息里,表的行数每次刷新都不一样
表是之前从某网站导出来的用户资料,InnoDB的
怀疑与engine有关,于是
ALTER TABLE `****` ENGINE=MyISAM;
果然,这回用
SHOW TABLE STATUS;
的显示正确了

然后去MySQL手册上寻求解释,发现了
12.5.5.34. SHOW TABLE STATUS Syntax
Rows 

The number of rows. Some storage engines, such as MyISAM, store the exact count. For other storage engines, such as InnoDB, this value is an approximation, and may vary from the actual value by as much as 40 to 50%. In such cases, use SELECT COUNT(*) to obtain an accurate count. 

The Rows value is NULL for tables in the INFORMATION_SCHEMA database. 

Monday, April 20, 2009

Sun acquired by Oracle...

MySQL was once MySQL AB.'s, then Sun's, and now Oracle's. While, InnoDB, one of the most commonly used storage engine in MySQL, was also acquired by Oracle years ago.
Wherez the future of MySQL ?

配置Apache Mod Proxy 实现密码认证的简单http代理

之前在某个机器上,关了日志,然后配了mod_proxy,以便自己进内网
但是,随着热心共享的人越来越多,这个80端口的代理成了一个公开的秘密
于是
现在要做的是,加密码
某些人别怪我不厚道
<IfModule mod_proxy.c>

<Proxy *>
Order deny,allow
Allow from all
AuthType basic
AuthName "private area"
AuthUserFile G:/.htpasswd
Require valid-user
</Proxy>
ProxyVia Block
</IfModule>


比较方便的是,htpasswd生成的密码不需要apache重启

不错,不错

Saturday, April 18, 2009

Configure SQL Developer with MySQL and MSSQL support

tanglewish给了一个页面,oracle的数据源文件,看到了某个站的oracle数据库连接串,于是很想连上去看看
但是手头没有任何可用的客户端

突然尝试用php的oci扩展,结果怎么启用都无法加载
分析估计是因为缺少instant client的原因

索性从Oracle官方下载了sql developer,毕竟是官方出品的东西
但是怎么测试都不行
那个ip的1521端口没开,估计有可能是被挡了
而同一个段的有两台机器开了但是连不上
于是放弃了

就当多了一个数据库管理软件

突然想起来,某台服务器的数据库连接串我还存着
mssql的

从http://jtds.sourceforge.net/下了一个jtds,然后把jar文件扔到sql developer 的lib目录,给配好了
拿着mssql的连接串,建了连接,测试
果然很方便

然后,http://mirror.bitunion.org/mysql/downloads/connector/j/5.1.html 下了个mysql的jdbc connector,也给配好了

Wednesday, April 15, 2009

Rest in peace ...

rt

Saturday, April 11, 2009

于是可以 /quit 了

不再怀疑当初的选择
不再后悔那时的消沉
不再笑话曾经的幼稚
。。。

…………

浑浑噩噩地过了两年半
一直在逃避
。。。
逃避了许久
终于可以真正地 /quit 了

Type /quit in the command box, say good bye to the past...

…………

/quit
然后就必须自己面对了
一切都是为了自己

/quit
然后就必须自己努力了
一切都是为了未来


/quit
不再无谓地权衡得与失
不再...

没有任何理由
没有任何借口

…………

几天后
也许,一个新的身份,又会让自己迷失
还好,再也不会消沉
一个全新的自己
自己的自己

…………

Maybe /quit, maybe /kick + /ban -ed
Anyway, i'll be no longer available in that channel.

…………

我老了

…………

/me quits.

Wednesday, April 8, 2009

开始匿了

一堆事情,明天争取搞定
然后
匿了
开始补考。。。。

为了自己

Sunday, April 5, 2009

应付gfw做的。。。。

只能这样了
天天改记录啊天天改记录