五千年(敝帚自珍)

主题:【原创】Chrome程序初探(序) -- 素里太守

共:💬73 🌺137
分页树展主题 · 全看首页 上页
/ 5
下页 末页
    • 家园 楼主多虑了

      长知识的东西我们都爱看。

    • 家园 欢呼,撒花

      我的小建议是除了代码,文字部分可以稍微多发挥一些

    • 家园 花花

      呵呵,说实在话的人,喜欢。

    • 家园 献花鼓励。。。
    • 家园 存技术的文章我喜欢,鲜花鼓励。
    • 家园 看不懂也要送花,坚决鼓励原创
    • 家园 一点小花絮,“:%” 虫

      Chrome推出后,网友们很快就发现了崩溃它的“秘诀” --- :%。

      于是有人说:

      也许,这本身就是一个彩蛋,Google Chrome开发人员的一个玩笑,要让Chrome崩溃如此简单。

      不过真实的情况是,这是一个虫,正二八经的虫。

      出错的代码位于c:\chrome\src\net\base\escape.cc,错误犯的还比较低级。

      std::string UnescapeURLImpl(const std::string& escaped_text,

      UnescapeRule::Type rules) {

      // The output of the unescaping is always smaller than the input, so we can

      // reserve the input size to make sure we have enough buffer and don't have

      // to allocate in the loop below.

      std::string result;

      result.reserve(escaped_text.length());

      for (size_t i = 0, max = escaped_text.size(), max_digit_index = max - 2;

      i < max; ++i) {

      if (escaped_text[i] == '%' && i < max_digit_index) {

      const std::string::value_type most_sig_digit(escaped_text[i + 1]);

      const std::string::value_type least_sig_digit(escaped_text[i + 2]);

      if (IsHex(most_sig_digit) && IsHex(least_sig_digit)) {

      unsigned char value = HexToInt(most_sig_digit) * 16 +

      HexToInt(least_sig_digit);

      当escaped_text的长度为1,而且仅包含%字符时“可能”出现非法访问的问题。

      俺把代码改了一下

      unsigned char textplusplus = ((i + 1) < max)?escaped_text[i + 2]:escaped_text[i + 1];

      const std::string::value_type most_sig_digit(escaped_text[i + 1]);

      const std::string::value_type least_sig_digit(textplusplus);

      编译链接,虫子没有了。

      安全专家、White Hat Security CTO杰雷米亚·格罗斯曼(Jeremiah Grossman)表示,或许Chrome有所不同,但这将取决于哪一方首先发现软件中的漏洞。他预测称,Chrome的第一个漏洞将会在24小时内被发现。格罗斯曼称:“即使拥有所有正确的设计概念,但如果忘记一行代码,一切都毫无意义。”


      本帖一共被 1 帖 引用 (帖内工具实现)
      • 家园 这样不会数组访问越界么?

        unsigned char textplusplus = ((i + 1) < max)?escaped_text[i + 2]:escaped_text[i + 1];

        const std::string::value_type most_sig_digit(escaped_text[i + 1]);http://www.ccthere.com/article/1782263.html

        const std::string::value_type least_sig_digit(textplusplus);

        (i+1)<max, 如果i+2=max的话 escaped_text[i+2] 就会访问escaped_text[max]。这样的话是不是就访问了长度为n得数组的第n+1个元素?

        是不是应该判断 (i+2)<max

        :%崩溃的这个问题是因为 max_digit_index 是 size_t类型的,也就是unsigned, max<2的话 max_digit_index就under flow了

        • 家园 【i+1】的问题。

          在该循环中 i 永远小于MAX,因此i + 1最多等于MAX,这里MAX等于字符串长度。在这种字符串内存中,内存真实长度永远等于MAX + 1,最后一个字符后【MAX】= 0。因此访问 i + 1永远不会出现非法访问,访问 i + 2则“有可能”出现,具体情况取决于那块内存类型 --- 堆内存,栈内存?

      • 家园 捉虫得宝

        恭喜:你意外获得【通宝】一枚

        鲜花已经成功送出。

        此次送花为【有效送花赞扬,涨乐善、声望】

      • 家园 送花 送花~~~`有好处啊

        恭喜:你意外获得【通宝】一枚

        鲜花已经成功送出。

        此次送花为【有效送花赞扬,涨乐善、声望】

分页树展主题 · 全看首页 上页
/ 5
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河