前往Shuct.Net首页

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

关于反编译的搜索

我是如何反编译D 首 页 阅览室 馆友 我的图书馆 我是如何反编译D 收藏人:quasiceo 2014-01-03 | 阅: 转: | 分享 | 大 中 小 我是如何反编译D-Link路由器固件程序并发现它的后门的 oschina 发布于: 2013年10月22日 (40评) 分享到 新浪微博腾讯微博 收藏+205 OK,又是周末晚上,没有约会,只有一大瓶Shasta汽水和全是快节奏的音乐…那就研究一下程序吧。 一时兴起,我下载了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函数和数据结构体的大概样子: 1struct http_request_t2{3 char unknown[0xB8];4 char *url; // At offset 0xB8 into the data structure5};6 7int 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字符串 这代码实际上就是: 1if(strstr(header, "User-Agent:") != NULL)2{3 http_request_t->0xD0 = header + strlen("User-Agent:") + strspn(header, " \t");4} 知道了http_request_t偏移量0xD0处的指针指向User-Agent头信息,我们可以推测出alpha_auth_check函数的结构: 01#define AUTH_OK 102#define AUTH_FAIL -103 04int alpha_auth_check(struct http_request_t *request)05{06 if(strstr(request->url, "graphic/") ||07 strstr(request->url, "public/") ||08 strcmp(request->user_agent, "xmlset_roodkcableoj28840ybtide") == 0)09 {10 return AUTH_OK;11 }12 else13 {14 // These arguments are probably user/pass or session info15 if(check_login(request->0xC, request->0xE0) != 0)16 {17 return AUTH_OK;18 }19 }20 21 return AUTH_FAIL;22} 换句话说,如果浏览器的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 ] 来自:quasiceo > 献花(0) +1 类似文章 更多 HTTP认证及其在Web平台中的实现 站长论坛---站长网址大全 - PHP获取当前... Linux下Tomcat与Apache Web服务器的整合... 高效配置Linux代理服务器――Squid Apache 伺服器管理 HTTP 的最佳化設定 -- 鄙雕兔 PHP新手上路中文教程 Websphere5.1.x JAAS LDAP配置全攻略(1... 热门推广 猜你喜欢为何拍不好人像中国历史上的七首国歌中华“鬼”文化释迦牟尼佛真身舍利,瞻礼获福无量!手动挡车起步技巧 发表评论: 最新文章网球单、双打比赛规则摘要Lua的语法是无歧义的吗?Lua 源码分析(一)lua 数据结构(转)十一、从头到尾彻底解析Hash表...Lua中的操作系统库 更多 热门文章 宝宝取名大全 全国旅游最佳的时间 奶奶给的药方:治好了我的慢性... 背单词,就这么简单!30分钟记... 世界拥有巨大的毛泽东思想文化... 男人无志,家道不兴,女人不柔... 莫言对年轻人的一百条忠告,看... 那时的他们,马云,俞敏洪,周... 从男人眼中看女人的世界!!! 绝美上下铺设计,看完我都心动... 奇,灵,美,惊美盆景 薪酬制度:无法逃避的难题 更多>> 关闭 关闭