前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于反编译的搜索

我是如何反编译D-Link路由器固件程序并发现它的后门的 | 外刊IT评论网 外刊IT评论首页关于我们关注我们给我来信关注我们邮件订阅分享这篇文章新浪微博QQ空间FacebookTwitter更多分享方式270&laquo; 上一篇|下一篇 &raquo; Search我是如何反编译D-Link路由器固件程序并发现它的后门的 Posted in 技术技巧 | 5 CommentsOK,又是周末晚上,没有约会,只有一大瓶Shasta汽水和全是快节奏的音乐&#8230;那就研究一下程序吧。一时兴起,我下载了D-link无线路由器(型号:DIR-100 revA)的固件程序 v1.13。使用工具Binwalk,很快的就从中发现并提取出一个只读SquashFS文件系统,没用多大功夫我就将这个固件程序的web server(/bin/webs)加载到了IDA中:/bin/webs中的字符信息基于上面的字符信息可以看出,这个/bin/webs二进制程序是一个修改版的thttpd,提供路由器管理员界面操作功能。看起来是经过了台湾明泰科技(D-Link的一个子公司)的修改。他们甚至很有心计的将他们很多自定义的函数名都辅以“alpha”前缀:明泰科技的自定义函数这个alpha_auth_check函数看起来很有意思!这个函数被很多地方调用,最明显的一个是来自alpha_httpd_parse_request函数:调用alpha_auth_check函数我们可以看到alpha_auth_check函数接收一个参数(是存放在寄存器$s2里);如果alpha_auth_check返回-1(0xFFFFFFFF),程序将会跳到alpha_httpd_parse_request的结尾处,否则,它将继续处理请求。寄存器$s2在被alpha_auth_check函数使用前的一些操作代码显示,它是一个指向一个数据结构体的指针,里面有一个char*指针,会指向从HTTP请求里接收到的各种数据;比如HTTP头信息和请求地址URL:$s2是一个指向一个数据结构体的指针我们现在可以模拟出alpha_auth_check函数和数据结构体的大概样子:struct http_request_t { char unknown[0xB8]; char *url; // At offset 0xB8 into the data structure }; int alpha_auth_check(struct http_request_t *request);alpha_auth_check本身是一个非常简单的函数。它会针对http_request_t结构体里的一些指针进行字符串strcmp比较操作,然后调用check_login函数,实际上就是身份验证检查。如果一旦有字符串比较成功或check_login成功,它会返回1;否者,它会重定向浏览器到登录页,返回-1;alpha_auth_check函数代码片段这些字符串比较过程看起来非常有趣。它们提取请求的URL地址(在http_request_t数据结构体的偏移量0xB8处),检查它们是否含有字符串“graphic/” 或 “public/”。这些都是位于路由器的Web目录下的公开子目录,如果请求地址包含这样的字符串,这些请求就可以不经身份认证就能执行。然而,这最后一个strcmp却是相当的吸引眼球:alpha_auth_check函数中一个非常有趣的字符串比较这个操作是将http_request_t结构体中偏移量0xD0的字符串指针和字符串“xmlset_roodkcableoj28840ybtide”比较,如果字符匹配,就会跳过check_login函数,alpha_auth_check操作返回1(认证通过)。我在谷歌上搜索了一下“xmlset_roodkcableoj28840ybtide”字符串,只发现在一个俄罗斯论坛里提到过它,说这是一个在/bin/webs里一个“非常有趣”的一行。我非常同意。那么,这个神秘的字符串究竟是和什么东西进行比较?如果回顾一下调用路径,我们会发现http_request_t结构体被传进了好几个函数:事实证明,http_request_t结构体中处在偏移量 0xD0处的指针是由httpd_parse_request函数赋值的:检查HTTP头信息中的User-Agent值将http_request_t + 0xD0指针指向头信息User-Agent字符串这代码实际上就是:if(strstr(header, "User-Agent:") != NULL) { http_request_t->0xD0 = header + strlen("User-Agent:") + strspn(header, " \t"); }知道了http_request_t偏移量0xD0处的指针指向User-Agent头信息,我们可以推测出alpha_auth_check函数的结构:#define AUTH_OK 1 #define AUTH_FAIL -1 int alpha_auth_check(struct http_request_t *request) { if(strstr(request->url, "graphic/") || strstr(request->url, "public/") || strcmp(request->user_agent, "xmlset_roodkcableoj28840ybtide") == 0) { return AUTH_OK; } else { // These arguments are probably user/pass or session info if(check_login(request->0xC, request->0xE0) != 0) { return AUTH_OK; } } return AUTH_FAIL; }换句话说,如果浏览器的User-Agent值是“xmlset_roodkcableoj28840ybtide”(不带引号),你就可以不经任何认证而能访问web控制界面,能够查看/修改路由器的设置(下面是D-Link路由器(DI-524UP)的截图,我没有 DIR-100型号的,但DI-524UP型号使用的是相同的固件):访问型号DI-524UP路由器的主界面基于HTML页上的源代码信息和Shodan搜索结果,差不多可以得出这样的结论:下面的这些型号的D-Link路由器将会受到影响:DIR-100DI-524DI-524UPDI-604SDI-604UPDI-604+TM-G5240除此之外,几款Planex路由器显然也是用的同样的固件程序:BRL-04URBRL-04CW你很酷呀,D-Link。脚注:万能的网友指出,字符串“xmlset_roodkcableoj28840ybtide”是一个倒序文,反过来读就是“editby04882joelbackdoor_teslmx”——edit by 04882joel backdoor _teslmx,这个后门的作者真是位天才! [英文原文:Reverse Engineering a D-Link Backdoor ] This entry was posted in 技术技巧 and tagged 反向工程, 反编译, 后门, 黑客. Bookmark the permalink.分享这篇文章新浪微博QQ空间FacebookTwitter更多分享方式270&laquo; 上一篇|下一篇 &raquo;你也许会喜欢这些文章:中间人攻击(man-in-the-middle attack):你和互联网中间的第三人如何黑一个黑客你能相信自己的眼睛吗?不要偷黑客的东西五大超级黑帽子黑客和五大超级白帽子黑客【视频】5 Responses to 我是如何反编译D-Link路由器固件程序并发现它的后门的 liangju0305 says: 2013年10月22日 at 9:19 上午哈哈,我们也曾经也干过这种事情,在自己的产品中留后门,以便以后维护方便! 回复 廖俊媛 says: 2013年10月22日 at 9:31 上午好吧,都被你们玩,,记得wordpress主题也可以留后门,随时获取最高权限,不知道博主的主题是否从正规渠道下载 回复 srzyhead says: 2013年10月22日 at 4:40 下午跳之前留点后路的节奏 回复 王先生 says: 2013年11月26日 at 10:05 上午由此可见他们的代码都没审核就可以发布。 这样if(contains(&#8220;***&#8221;))的判断代码一眼就能看出。这和有的输入错误三次某个密码的就登录成功的水平是一样的, 不过博主的逆向技术感觉很流弊。 回复 小草元 says: 2013年12月9日 at 2:26 下午倒文…真有创意。当我哪天牛B了我就把昵称倒过来。。。 回复发表评论 取消回复电子邮件地址不会被公开。 必填项已用*标注姓名 * 电子邮件 * 站点 壹加壹等于 评论您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> 文章分类Java评论创业理想团队建设幽默讽刺心得体会思想人生批评评论技术技巧敏捷开发文档手册新闻资讯杂项求职招聘移动开发软件工具最受欢迎的文章 133 使用站立式办公桌的体验 174 你真想到了50岁还靠编程来养家糊口吗? 131 软件开发中团队首领的好坏之分 115 疯狂的编程世界 498 为什么程序员都是夜猫子 132 给年轻程序员的几句话 218 为什么程序员的工作效率跟他们的工资不成比例 129 千万别要孩子 308 你第一要做的是开始去做 187 早该知道的7个JavaScript技巧 280 绝望的SQL 888 坐得越久 死得越快 本站使用的是由西部数码提供的B032型Linux虚拟主机外刊IT评论TodayMondaySundaySaturdayFridayThursdayWednesday网站导航首页 全部文章关于本站联系我们特色栏目十大传文十大评论编程视频全部文章订阅我们RSS订阅邮件订阅 关注我们新浪微博腾讯微博TwitterRSS You had mail. Paul read it, so ask him what it said. 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议进行许可。 备案信息:京ICP备12002735号 京公网安备11010802009600号