-->

imdb返回墙内!

2013年3月12日星期二 发帖者 Ngo 0 评论0 多说评论
imdb返回墙内!
imdb返回墙内!
imdb返回墙内!
标签: ,

使用 GDB 调试 Linux 软件

2013年3月10日星期日 发帖者 Ngo 0 评论0 多说评论

使用 GDB 调试 Linux 软件

GNU 调试器简介
David SeagerCICS/390 开发部,IBM Hursley
简介: Linux 的大部分特色源自于 shell 的 GNU 调试器,也称作 gdb。gdb 可以让您查看程序的内部结构、打印变量值、设置断点,以及单步调试源代码。它是功能极其强大的工具,适用于修复程序代码中的问题。在本文中,David Seager 将尝试说明 gdb 有多棒,多实用。
开始调试之前,必须用程序中的调试信息编译要调试的程序。这样,gdb 才能够调试所使用的变量、代码行和函数。如果要进行编译,请在 gcc(或 g++)下使用额外的 '-g' 选项来编译程序:
gcc -g eg.c -o eg

在 shell 中,可以使用 'gdb' 命令并指定程序名作为参数来运行 gdb,例如 'gdb eg';或者在 gdb 中,可以使用 file 命令来装入要调试的程序,例如 'file eg'。这两种方式都假设您是在包含程序的目录中执行命令。装入程序之后,可以用 gdb 命令 'run' 来启动程序。
如果一切正常,程序将执行到结束,此时 gdb 将重新获得控制。但如果有错误将会怎么样?这种情况下,gdb 会获得控制并中断程序,从而可以让您检查所有事物的状态,如果运气好的话,可以找出原因。为了引发这种情况,我们将使用一个 示例程序:

代码示例 eg1.c
#include 
int wib(int no1, int no2)
{
  int result, diff;
  diff = no1 - no2;
  result = no1 / diff;
  return result;
}
int main(int argc, char *argv[])
{
  int value, div, result, i, total;
  value = 10;
  div = 6;
  total = 0;
  for(i = 0; i < 10; i++)
  {
    result = wib(value, div);
    total += result;
    div++;
    value--;
  }
  printf("%d wibed by %d equals %d\n", value, div, total);
  return 0;
}

这个程序将运行 10 次 for 循环,使用 'wib()" 函数计算出累积值,最后打印出结果。
在您喜欢的文本编辑器中输入这个程序(要保持相同的行距),保存为 'eg1.c',使用 'gcc -g eg1.c -o eg1' 进行编译,并用 'gdb eg1' 启动 gdb。使用 'run' 运行程序可能会产生以下消息:
Program received signal SIGFPE, Arithmetic exception.
0x80483ea in wib (no1=8, no2=8) at eg1.c:7
7         result = no1 / diff;
(gdb)

gdb 指出在程序第 7 行发生一个算术异常,通常它会打印这一行以及 wib() 函数的自变量值。要查看第 7 行前后的源代码,请使用 'list' 命令,它通常会打印 10 行。再次输入 'list'(或者按回车重复上一条命令)将列出程序的下 10 行。从 gdb 消息中可以看出,第 7 行中的除法运算出了错,程序在这一行中将变量 "no1" 除以 "diff"。
要查看变量的值,使用 gdb 'print' 命令并指定变量名。输入 'print no1' 和 'print diff',可以相应看到 "no1" 和 "diff" 的值,结果如下:
(gdb) print no1
$5 = 8
(gdb) print diff
$2 = 0

gdb 指出 "no1" 等于 8,"diff" 等于 0。根据这些值和第 7 行中的语句,我们可以推断出算术异常是由除数为 0 的除法运算造成的。清单显示了第 6 行计算的变量 "diff",我们可以打印 "diff" 表达式(使用 'print no1 - no2' 命令),来重新估计这个变量。gdb 告诉我们 wib 函数的这两个自变量都等于 8,于是我们要检查调用 wib() 函数的 main() 函数,以查看这是在什么时候发生的。在允许程序自然终止的同时,我们使用 'continue' 命令告诉 gdb 继续执行。
(gdb) continue
Continuing.
Program terminated with signal SIGFPE, Arithmetic exception.
The program no longer exists.

为了查看在 main() 中发生了什么情况,可以在程序代码中的某一特定行或函数中设置断点,这样 gdb 会在遇到断点时中断执行。可以使用命令 'break main' 在进入 main() 函数时设置断点,或者可以指定其它任何感兴趣的函数名来设置断点。然而,我们只希望在调用 wib() 函数之前中断执行。输入 'list main' 将打印从 main() 函数开始的源码清单,再次按回车将显示第 21 行上的 wib() 函数调用。要在那一行上设置断点,只需输入 'break 21'。gdb 将发出以下响应:
(gdb) break 21
Breakpoint 1 at 0x8048428: file eg1.c, line 21.

以显示它已在我们请求的行上设置了 1 号断点。'run' 命令将从头重新运行程序,直到 gdb 中断为止。发生这种情况时,gdb 会生成一条消息,指出它在哪个断点上中断,以及程序运行到何处:
Breakpoint 1, main (argc=1, argv=0xbffff954) at eg1.c:21
21          result = wib(value, div);

发出 'print value' 和 'print div' 将会显示在第一次调用 wib() 时,变量分别等于 10 和 6,而 'print i' 将会显示 0。幸好,gdb 将显示所有局部变量的值,并使用 'info locals' 命令保存大量输入信息。
从以上的调查中可以看出,当 "value" 和 "div" 相等时就会出现问题,因此输入 'continue' 继续执行,直到下一次遇到 1 号断点。对于这次迭代,'info locals' 显示了 value=9 和 div=7。
与其再次继续,还不如使用 'next' 命令单步调试程序,以查看 "value" 和 "div" 是如何改变的。gdb 将响应:
(gdb) next
22          total += result;

再按两次回车将显示加法和减法表达式:
(gdb)
23          div++;
(gdb)
24          value--;

再按两次回车将显示第 21 行,wib() 调用。'info locals' 将显示目前 "div" 等于 "value",这就意味着将发生问题。如果有兴趣,可以使用 'step' 命令(与 'next' 形成对比,'next' 将跳过函数调用)来继续执行 wib() 函数,以再次查看除法错误,然后使用 'next' 来计算 "result"。
现在已完成了调试,可以使用 'quit' 命令退出 gdb。由于程序仍在运行,这个操作会终止它,gdb 将提示您确认。
由于我们想要知道在调用 wib() 函数之前 "value" 什么时候等于 "div",因此在上一示例中我们在第 21 行中设置断点。我们必须继续执行两次程序才会发生这种情况,但是只要在断点上设置一个条件就可以使 gdb 只在 "value" 与 "div" 真正相等时暂停。要设置条件,可以在定义断点时指定 "break <line number> if <conditional expression>"。将 eg1 再次装入 gdb,并输入:
(gdb) break 21 if value==div
Breakpoint 1 at 0x8048428: file eg1.c, line 21.

如果已经在第 21 行中设置了断点,如 1 号断点,则可以使用 'condition' 命令来代替在断点上设置条件:
(gdb) condition 1 value==div

使用 'run' 运行 eg1.c 时,如果 "value" 等于 "div",gdb 将中断,从而避免了在它们相等之前必须手工执行 'continue'。调试 C 程序时,断点条件可以是任何有效的 C 表达式,一定要是程序所使用语言的任意有效表达式。条件中指定的变量必须在设置了断点的行中,否则表达式就没有什么意义!
使用 'condition' 命令时,如果指定断点编号但又不指定表达式,可以将断点设置成无条件断点,例如,'condition 1' 就将 1 号断点设置成无条件断点。
要查看当前定义了什么断点及其条件,请发出命令 'info break':
(gdb) info break
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x08048428 in main at eg1.c:21
        stop only if value == div
        breakpoint already hit 1 time

除了所有条件和已经遇到断点多少次之外,断点信息还在 'Enb' 列中指定了是否启用该断点。可以使用命令 'disable <breakpoint number>'、'enable <breakpoint number>' 或 'delete <breakpoint number>' 来禁用、启用和彻底删除断点,例如 'disable 1' 将阻止在 1 号断点处中断。
如果我们对 "value" 什么时候变得与 "div" 相等更感兴趣,那么可以使用另一种断点,称作监视。当指定表达式的值改变时,监视点将中断程序执行,但必须在表达式中所使用的变量在作用域中时设置监视点。要获取作用域中的 "value" 和 "div",可以在 main 函数上设置断点,然后运行程序,当遇到 main() 断点时设置监视点。重新启动 gdb,并装入 eg1,然后输入:
(gdb) break main
Breakpoint 1 at 0x8048402: file eg1.c, line 15.
(gdb) run
...
Breakpoint 1, main (argc=1, argv=0xbffff954) at eg1.c:15
15        value = 10;

要了解 "div" 何时更改,可以使用 'watch div',但由于要在 "div" 等于 "value" 时中断,那么应输入:
(gdb) watch div==value
Hardware watchpoint 2: div == value

如果继续执行,那么当表达式 "div==value" 的值从 0(假)变成 1(真)时,gdb 将中断:
(gdb) continue
Continuing.
Hardware watchpoint 2: div == value
Old value = 0
New value = 1
main (argc=1, argv=0xbffff954) at eg1.c:19
19        for(i = 0; i < 10; i++)

'info locals' 命令将验证 "value" 是否确实等于 "div"(再次声明,是 8)。
'info watch' 命令将列出已定义的监视点和断点(此命令等价于 'info break'),而且可以使用与断点相同的语法来启用、禁用和删除监视点。
在 gdb 下运行程序可以使俘获错误变得更容易,但在调试器外运行的程序通常会中止而只留下一个 core 文件。gdb 可以装入 core 文件,并让您检查程序中止之前的状态。
在 gdb 外运行示例程序 eg1 将会导致核心信息转储:
$ ./eg1
Floating point exception (core dumped)

要使用 core 文件启动 gdb,在 shell 中发出命令 'gdb eg1 core' 或 'gdb eg1 -c core'。gdb 将装入 core 文件,eg1 的程序清单,显示程序是如何终止的,并显示非常类似于我们刚才在 gdb 下运行程序时看到的消息:
...
Core was generated by `./eg1'.
Program terminated with signal 8, Floating point exception.
...
#0  0x80483ea in wib (no1=8, no2=8) at eg1.c:7
7         result = no1 / diff;

此时,可以发出 'info locals'、'print'、'info args' 和 'list' 命令来查看引起除数为零的值。'info variables' 命令将打印出所有程序变量的值,但这要进行很长时间,因为 gdb 将打印 C 库和程序代码中的变量。为了更容易地查明在调用 wib() 的函数中发生了什么情况,可以使用 gdb 的堆栈命令。
程序“调用堆栈”是当前函数之前的所有已调用函数的列表(包括当前函数)。每个函数及其变量都被分配了一个“帧”,最近调用的函数在 0 号帧中(“底部”帧)。要打印堆栈,发出命令 'bt'('backtrace' [回溯] 的缩写):
(gdb) bt
#0  0x80483ea in wib (no1=8, no2=8) at eg1.c:7
#1  0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21

此结果显示了在 main() 的第 21 行中调用了函数 wib()(只要使用 'list 21' 就能证实这一点),而且 wib() 在 0 号帧中,main() 在 1 号帧中。由于 wib() 在 0 号帧中,那么它就是执行程序时发生算术错误的函数。
实际上,发出 'info locals' 命令时,gdb 会打印出当前帧中的局部变量,缺省情况下,这个帧中的函数就是被中断的函数(0 号帧)。可以使用命令 'frame' 打印当前帧。要查看 main 函数(在 1 号帧中)中的变量,可以发出 'frame 1' 切换到 1 号帧,然后发出 'info locals' 命令:
(gdb) frame 1
#1  0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21
21          result = wib(value, div);
(gdb) info locals
value = 8
div = 8
result = 4
i = 2
total = 6

此信息显示了在第三次执行 "for" 循环时(i 等于 2)发生了错误,此时 "value" 等于 "div"。
可以通过如上所示在 'frame' 命令中明确指定号码,或者使用 'up' 命令在堆栈中上移以及 'down' 命令在堆栈中下移来切换帧。要获取有关帧的进一步信息,如它的地址和程序语言,可以使用命令 'info frame'。
gdb 堆栈命令可以在程序执行期间使用,也可以在 core 文件中使用,因此对于复杂的程序,可以在程序运行时跟踪它是如何转到函数的。
除了调试 core 文件或程序之外,gdb 还可以连接到已经运行的进程(它的程序已经过编译,并加入了调试信息),并中断该进程。只需用希望 gdb 连接的进程标识替换 core 文件名就可以执行此操作。以下是一个执行循环并睡眠的 示例程序

eg2 示例代码
#include 
int main(int argc, char *argv[])
{
  int i;
  for(i = 0; i < 60; i++)
  {
    sleep(1);
  }
  return 0;
}

使用 'gcc -g eg2.c -o eg2' 编译该程序并使用 './eg2 &' 运行该程序。请留意在启动该程序时在背景上打印的进程标识,在本例中是 1283:
./eg2 &
[3] 1283

启动 gdb 并指定进程标识,在我举的这个例子中是 'gdb eg2 1283'。gdb 会查找一个叫作 "1283" 的 core 文件。如果没有找到,那么只要进程 1283 正在运行(在本例中可能在 sleep() 中),gdb 就会连接并中断该进程:
...
/home/seager/gdb/1283: No such file or directory.
Attaching to program: /home/seager/gdb/eg2, Pid 1283
...
0x400a87f1 in __libc_nanosleep () from /lib/libc.so.6
(gdb)

此时,可以发出所有常用 gdb 命令。可以使用 'backtrace' 来查看当前位置与 main() 的相对关系,以及 mian() 的帧号是什么,然后切换到 main() 所在的帧,查看已经在 "for" 循环中运行了多少次:
(gdb) backtrace
#0  0x400a87f1 in __libc_nanosleep () from /lib/libc.so.6
#1  0x400a877d in __sleep (seconds=1) at ../sysdeps/unix/sysv/linux/sleep.c:78
#2  0x80483ef in main (argc=1, argv=0xbffff9c4) at eg2.c:7
(gdb) frame 2
#2  0x80483ef in main (argc=1, argv=0xbffff9c4) at eg2.c:7
7           sleep(1);
(gdb) print i
$1 = 50

如果已经完成了对程序的修改,可以 'detach' 命令继续执行程序,或者 'kill' 命令杀死进程。还可以首先使用 'file eg2' 装入文件,然后发出 'attach 1283' 命令连接到进程标识 1283 下的 eg2。
gdb 可以让您通过使用 shell 命令在不退出调试环境的情况下运行 shell 命令,调用形式是 'shell [commandline]',这有助于在调试时更改源代码。
最后,在程序运行时,可以使用 'set ' 命令修改变量的值。在 gdb 下再次运行 eg1,使用命令 'break 7 if diff==0' 在第 7 行(将在此处计算结果)设置条件断点,然后运行程序。当 gdb 中断执行时,可以将 "diff" 设置成非零值,使程序继续运行直至结束:
Breakpoint 1, wib (no1=8, no2=8) at eg1.c:7
7         result = no1 / diff;
(gdb) print diff
$1 = 0
(gdb) set diff=1
(gdb) continue
Continuing.
0 wibed by 16 equals 10
Program exited normally.

GNU 调试器是所有程序员工具库中的一个功能非常强大的工具。在本文中,我只介绍了 gdb 的一小部分功能。要了解更多知识,建议您阅读 GNU 调试器手册。

David Seager 是 IBM 的软件开发人员,他从事 Linux 和基于 Web 的应用工作已有两年时间了。
标签:

[转载] 手把手教你劫持李开复的腾讯微博

2013年2月28日星期四 发帖者 Ngo 0 评论0 多说评论
http://www.wooyun.org/bugs/wooyun-2013-017137#0-tsina-1-3380-397232819ff9a47a7b7e80a40613cfe1

漏洞标题: 手把手教你劫持李开复的腾讯微博

相关厂商: 腾讯微搏

漏洞作者: 胖子变瘦了

提交时间: 2013-01-14

公开时间: 2013-02-28

漏洞类型: 设计缺陷/逻辑错误

危害等级: 中

自评Rank: 5

漏洞状态: 未联系到厂商或者厂商积极忽略

漏洞来源: http://www.wooyun.org

Tags标签: 无

8人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-01-14: 积极联系厂商并且等待厂商认领中,细节不对外公开
2013-02-28: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

想劫持李开复老师的微博怎么办?

发私信扔个URL?NO,人家不会看私信的。

发邮箱?NO,压根不知道邮箱是多少?

还有什么办法呢?那就是本文!

李开复老师,注意安全哟

详细说明:

1. 如简单描述中所述,常规方法多半是不行的。

2. 我们根据李开复老师的职业习惯,以及微博发送内容,可以了解到他经常会上一些资讯、科技类网站。比如36kr。如果我们能在36kr的网站上插入一段JS代码,里面再嵌入一个反射型XSS,此时李开复老师访问36kr且带有QQ的登录状态。我们就可以成功劫持李开复老师微博了。

3. 36kr是很多站长,投资人都会去上的一个资讯网站。本人身边也有不少朋友经常去看。网站本身是否可被入侵不得而知,但是难度相对不小。看了看36kr。没什么问题,挺小清新的。

【图片1】
1.jpg


4. 随后点进去一篇文章,可以看到文章的最下方,有社交评论插件。

【图片2】
2.jpg


3. 问题就在这里了。 这个评论插件是一家第三方网站(denglu.cc),而且经过我们的检测,是存在安全问题的。例如:这里我们对其进行了XSS检测,发现其存在存储型XSS。我们可以成功在评论中插入我们的XSS代码。

【图片3】
3.jpg


4. 当然,惯性的思维是,就算是denglu.cc存在XSS,顶多影响的是denglu.cc的用户,而实际上并不是这样。 我们完全可以植入36kr.com自己的反射型XSS,或者第三方网站,如:腾讯的反射型XSS,来达到存储型XSS的效果。

这里以腾讯某处反射型XSS为例。我们在36kr的文章下进行批量推送评论。

【图片4】
4.jpg


5. 这样一来,我们的恶意JS代码,就被夹杂到36kr的文章评论中了,见步骤3截图。

当然普通用户对此会毫不知情。一旦用户访问了36kr的文章,我就会让他们去关注乌云的腾讯微博。

6. 接着就是等待。 终于在某一天,李开复老师来了。我看到他的腾讯微博关注了【乌云漏洞报告平台】以及某些QQ官方账号 (这些账号用做参照:排除因为李开复老师自己主动收听【乌云漏洞报告平台】而造成的假阳性结果)。

【图片5】
5.jpg


7. 我们通过,36kr --> denglu.cc --> 腾讯某站反射型XSS --> 腾讯微博 的方式,在不是非常漫长的蹲点之后,捕获到了李开复老师的微博。在整个过程中,我们还捕获到了很多其他站长以及投资人的微博。其中也包括其他网站的某些人,比如UCWEB的,还包括36kr自己网站的一些人。腾讯的cookies没有http-only,因此我们可以使用获取的cookies,来使用这些帐号登录QQ其他应用(如QQ邮箱),进而进行后续利用(具体利用危害见: WooYun: 跨站脚本-可以让战场离得更远(浅谈腾讯架构缺陷) )。如下图:

【图6】
6.jpg


8. 声明:我们是友好的测试,整个测试过程中,并未获取记录任何cookies数据,关注微博的请求是通过csrf来实现的。我们使用“微博关注”的方式来统计了危害效果,并未动用victim的微博帐号去做任何其他事情。



9. 最后总结:

到头来,本质上来说,漏洞的根源在于腾讯和denglu.cc,而36kr只是一个第三方插件的受害者,成为了攻击者的跳板。我们可以从中学习到两点。

9.1. 腾讯业务线长,类似的反射型XSS漏洞十分多,依靠腾讯安全 中心每天扫描后,再做一些不是很靠谱的修复,只是增加了攻击者寻找缺陷的时间而已,但是并没有从真正意义上解决用户的安全问题,这种解决方式是十分、非常、极其不可取的。本例就是一个典型,修复了成百上千个XSS又如何?再随便找一个反射型XSS就over了。

任何一个【微不足道的】分站的【微不足道的】反射型XSS都会危害到用户的微博,邮箱,QQ空间等应用是一件多么可怕的事情。试想,你们还敢随便点开一个网页吗? 一点开,就莫名其妙的,自己QQ的各种WEB应用随时被劫持?随时受不了,随手受不了。

因此强烈建议,腾讯微博自己再加一次验证吧。


9.2. denglu.cc这种第三方的插件也在不断涌现,而其中一部分程序在设计时又缺乏对安全的考虑。因此站长在使用此类程序时,请谨慎选择,勿将用户的安全抛给了第三方的插件。


截至本稿:36kr官方已经更换掉了第三方评论插件。

漏洞证明:

5.jpg

修复方案:

36KR已经换了评论插件,denglu.cc的问题还没修复.重要的是腾讯微搏的问题要好好修修.

版权声明:转载请注明来源 胖子变瘦了@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝

漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值
标签: , ,

基地后传1:基地边缘

2013年2月6日星期三 发帖者 Ngo 0 评论0 多说评论
基地建立了500年了,离谢顿计划估计的第二帝国成立还剩下一半时间。现在的基地已经壮大到统治了大部分的银河星系,并且还有若干的联盟。以基地的科技和现有的军事力量,统一银河绰绰有余,为什么还要非等500年呢?现在统一了银河就可以永恒载入史册了,基地的女市长赫拉·布拉诺不可能没想到这一点。

另一方面,尽管第一基地(现在可以称为基地帝国了)的人们都认为第二基地已经彻底“消失”了,总有极少数思想怪异的人事情不是那么简单。首先,谢顿计划过于完美。每次谢顿危机的时候,谢顿的影像总是如期而至,这次基地迁都到卡尔根星球时间的解决正是依靠谢顿的预言。年轻的基地议员葛兰·崔维兹认为这是政府为实现目的而伪造的谢顿影像,“这只是政客的手段罢了”,因为人们无法区分谢顿影像是否仍然是谢顿于500年前录制的。因为至少“骡”的出现搅乱了谢顿计划,难道谢顿计划因此没有受到影响?他还能预测正确500年的事情吗?其次,如果谢顿计划就是这么完美,即使被扰乱之后仍能纠正轨道正确发展,那是否意味着第二基地仍然存在于银河之内?第二基地仍然遥控着银河的发展?第二帝国建立后第二基地凌驾于第一基地之上成为领导者绝对是不可接受的。

基地市长布拉诺并非没有这种想法,不过并不打算让这个思想影响普通民众而导致影响到自己再基地世界的权威,因此议员崔维兹因不相信谢顿计划如此完美而大闹议会之后,布拉诺决定将其驱逐出端点星。与崔维兹同行的还有基地历史学权威詹诺夫·裴洛拉特,但是,他们互相并不知道对方的状况 --- 一个寻找第二基地,一个寻找人类的起源,地球。

怀疑谢顿计划的,并非只有第一基地的人,川陀的年轻有为的坚迪柏发言者同样有自己的想法。第二基地这些年努力修正“骡”给谢顿计划带来的巨大偏差,目前基本回到了谢顿当年指定的路径上,而坚迪柏的推算结果却显示并非如此。坚迪柏认为,公式的偏差和计划的仍按原始设计发展说明除了第二基地外,仍有第三方力量在维护着谢顿计划的运行,那将是一群类似“骡”的人,或者称为“反骡”。尽管坚迪柏使第二基地首席发言者相信了自己的论断,但仍然得到其他发言人的质疑。坚迪柏为了证明自己的论断,毅然决定寻找“反骡”,他带着新收的徒弟,川陀居住的阿姆人诺薇,踏上了探索奥秘的旅程。

通过与历史学家裴洛拉特的讨论,崔维兹认为地球才是第二基地的大本营。但是在整个银河系的历史上,并没有一个明确的记录表明哪个行星就是地球。在传说中,赛协尔星区的盖娅是被称为“地球”的行星之一,崔维兹和裴洛拉特在赛协尔得到信息是,盖娅位于超空间中,且任何人无法靠近,以往所有靠近的人都一去无回,甚至当年“骡”也不敢去攻打盖娅。崔维兹决定冒险去探索未知的盖娅。

正所谓螳螂捕蝉黄雀在后,崔维兹和裴洛拉特逐渐靠近盖娅的同时吸引了两拨人的注意,第一基地的市长布拉诺和第二基地的未来之星坚迪柏发言者。布拉诺认为第二基地已经找到,打败第二基地并将赛协尔星区囊括到基地势力范围之下;坚迪柏则相信“反骡”的大本营就在盖娅,只要集合第二基地所有人的力量打败“反骡”就可摆脱束缚。

冤家路窄,坚迪柏和布拉诺不期而遇,第一基地与第二基地的大战一触即发!要么你死我活,也么同归于尽!

崔维兹对背后的情形一无所知,他和裴洛拉特眼前只有盖娅。一股神秘的力量俘获了崔维兹的飞船,飞船正在一步步坠向盖娅,此时一个完美的女人宝绮思出现了...

盖娅现在面临一个两难抉择,它需要找到一个天赋异禀的人来帮助解决疑惑。盖娅难以决断的是,是否要把银河系发展成为一个思想统一体,崔维兹先天具有一种正确选择的能力,他可以帮助盖娅。如果崔维兹选择了盖娅,银河系将朝着盖娅帝国的方向发展,所有物质将统一为盖娅,如果崔维兹选择了另一个方向,盖娅边际的第一基地和第二基地的战争将会打响,无论哪个基地失败,银河系必会重回混乱蛮荒的时代至少一两万年之久。

盖娅外,坚迪柏和布拉诺仍然在僵持中,第一基地的科技已经可以开始遏制第二基地的部分精神力量,坚迪柏力不从心的时刻发现猛然徒弟诺薇的内心发出强大的超出想象的精神力量帮助自己抵制住了布拉诺的精神武器,此刻坚迪柏恍然大悟,诺薇就是盖娅,这个远超第二基地力量的“普通”女子来自盖娅,而自己和第二基地是,此渺小。

崔维兹选择了盖娅,裴洛拉特选择了宝绮思,世界重归平静。坚迪柏认为自己依靠第二基地全体的力量击退了第一基地,并改写了布拉诺的思想,使后者抛弃脑中第二基地仍然存在的想法,谢顿计划得以继续执行;布拉诺认为自己战胜了赛协尔星区,现在赛协尔已经属于基地范畴,基地舰队凯旋端点星。现在,坚迪柏和布拉诺脑中盖娅只是个无聊的传说,诺薇还是那个思维单纯的阿姆人,崔维兹仍然是令人讨厌的捣蛋鬼。

不过,崔维兹并不明白自己为什么选择了盖娅,他了解到,盖娅是早期人类银河开拓的星球之一,也许,这是个由机器人建立的星球。而解开问题的关键是,找到地球!
标签: ,

Pagerank刚刚更新啦!

2013年2月4日星期一 发帖者 Ngo 1 评论0 多说评论
Pagerank刚刚更新啦!这个站和 www.obugs.net 的pr都更新了!都从3跌倒2了,哈哈!

另外,丑博客儿(www.choublogger.com)太新了,还木有pr~

看来前面的预测没错哦~
标签: ,

【转】人物杂志:厉害女士

2013年2月3日星期日 发帖者 Ngo 1 评论0 多说评论
厉害女士

袁厉害收养了一百多个弃婴,又将他们按优劣分级;她拥有好人的声望,又将声望转化为生意。她财产众多,却无法声张。她并不高尚无私,只是一个精明又普通、善心和私欲共存的农妇。成为今天的"厉害女士",她除了凭借在中国传统人情社会里翻滚半生获得的经验,还有身后浓厚的文化与政治土壤。

原文链接:http://e.weibo.com/1043325954/zhvZUCcNl

skydrive图片加载中
标签:

2013年google pagerank更新时间预测

2013年2月2日星期六 发帖者 Ngo 1 评论0 多说评论

  • 1st Update – January 28 to February 6
  • 2nd Update – June 27 to July 7
  • 3rd Update – September 29 to 4 October
  • 4th Update – 24 December to 29 december
标签: ,