首页 > 其他分享 >[WUSTCTF 2020](病假回归)

[WUSTCTF 2020](病假回归)

时间:2023-12-08 21:44:37浏览次数:56  
标签:char TreeNode struct int 病假 a1 2020 WUSTCTF root

[WUSTCTF 2020]level1

下载下来后有俩文件,先看level1

查壳,无壳64位,拖入IDA中

image

看到其中的i&1,为按位与运算,取2进制整数 i 的最低位,如果最低位是1 则得1,如果最低位是0 则得0。 奇数 i 的最低位 是1,偶数i 的最低位 是0。

再看到output文件,里面有

198,232,816,200,1536,300,6144,984,51200,570,92160,1200,565248,756,1474560,800,6291456,1782,65536000

那么就可以编写脚本了

flag = [0,198,232,816,200,1536,300,6144,984,51200,570,92160,1200,565248,756,1474560,800,6291456,1782,65536000]
for i in range(1,20):
    if(i & 1) != 0:
        flag[i] = flag[i] >> i
    else:
        flag[i] = flag[i] // i
print(''.join([chr(i)for(i)in(flag)]))

image

[WUSTCTF 2020]level2

根据题目叙述,有UPX壳,查壳看看,UPX壳32位

image

脱个壳玩玩,一定要注意文件位置的命名不能带有'[]'这个东西!

image

打开看看

image

[WUSTCTF 2020]level3

查壳,拖入IDA中

image
image

看到了加密后的码,再找找码表,shift12看看

但发现只有63个字母少了,前面应该还有A

因为它提示换表且有交叉引用的考点,所以点进base函数看看,交叉引用base64_table

image

看到了LookAtYou,跟进

image

是个换表题,编写脚本

#include<stdio.h>
#include<stdlib.h>
int main() {
    char v1;
    int i;
    int result;
    char base[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    for (i = 0; i <= 9; ++i)
    {
        v1 = base[i];
        base[i] = base[19 - i];
        result = 19 - i;
        base[result] = v1;
    }
    printf("%s", base);
    return 0;
}

image

放到赛博橱子里看看

image

[WUSTCTF 2020]level4

查壳,无壳64位

image

拖进IDA中

image

有init(),type1(),type2()这三个函数值得查看

init()

image

有个赋值操作,字符串为'I{_}Af2700ih_secTS2Et_wr'

type1()

image

type2()

image

下面两个是递归函数,但我不能更好地理解...

查看wp后发现要动态调试,也可以拖入kali中运行,因为这个文件是ELF文件

image

根据wp和运行可知,这是在考察二叉树的前、中、后序遍历

所以说init函数里的就是总的字符串,为'I{_}Af2700ih_secTS2Et_wr'

type1为中序,type2为后序,而中后序遍历的结果就为上图所示

至于如何判断的前中后序:
前序:根左右
中序:左根右
后序:左右根

所以脚本为(以后遇到二叉树可以套模)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct TreeNode 
{
    char val;
    struct TreeNode* left;//左子树
    struct TreeNode* right;//右子树
};
 
struct TreeNode* buildTree(char* inorder, int inStart, int inEnd, char* postorder, int postStart, int postEnd) 
{
    if (inStart > inEnd || postStart > postEnd) //如果大于最大长度就结束
    {
        return NULL;
    }
 
    struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));//创建一个动态结构体数组
    root->val = postorder[postEnd];//指向后序中的根字符
 
    int i;
    for (i = inStart; i <= inEnd; i++) //计算中序的左子树长度
    {
        if (inorder[i] == postorder[postEnd]) //如果中序的字符与后序最后一个字符相等就结束计算,也就是最终的根
        {
            break;
        }
    }
    //开始构建树
    root->left = buildTree(inorder, inStart, i - 1, postorder, postStart, postStart + i - inStart - 1);
    root->right = buildTree(inorder, i + 1, inEnd, postorder, postStart + i - inStart, postEnd - 1);
 
    return root;
}
 
void preOrder(struct TreeNode* root) 
{
    if (!root) 
    {
        return;
    }
 
    printf("%c", root->val);
    preOrder(root->left);
    preOrder(root->right);
}
 
int main()
{
    char inorderStr[] = "2f0t02T{hcsiI_SwA__r7Ee}";//已知中序
    char postorderStr[] = "20f0Th{2tsIS_icArE}e7__w";//已知后序
    int n = strlen(inorderStr);
 
    struct TreeNode* root = buildTree(inorderStr, 0, n - 1, postorderStr, 0, n - 1);
    printf("前序遍历结果为: ");
    preOrder(root);
 
    return 0;
}

image

此题还有一种解法,那就是画图

image

这个遍历顺序问题画图解决最直观,但要注意别找错了,要不烦死

当然,你也可以在线工具直接一波带走

image

[WUSTCTF 2020]Cr0ssfun

查壳,无壳64位

image

拖进IDA中查看

image

应该是check函数进行了加密,点进去看看,一路跟进

image
image
image
image
image
image
image

跟进完后,发现是明文flag,直接脚本操作

#include<stdio.h>
int main()
{
	char a1[33];
	a1[10] = 'p'; 
	a1[13] = '@';
	a1[3] = 'f';
	a1[26] = 'r'; 
	a1[20] = 'e';
	a1[7] = '0';
	a1[16] = '_'; 
	a1[11] = 'p'; 
	a1[23] = 'e';
	a1[30] = 'u';
	a1[0] = 'w';
	a1[6] = '2'; 
	a1[22] = 's';
	a1[31] = 'n';
	a1[12] = '_';
	a1[15] = 'd'; 
	a1[8] = '{';
	a1[18] = '3';
	a1[28] = '_'; 
	a1[21] = 'r';
	a1[2] = 't';
	a1[9] = 'c';
	a1[32] = '}';
	a1[19] = 'v';
	a1[5] = '0';
	a1[14] = 'n';
	a1[4] = '2'; 
	a1[17] = 'r'; 
	a1[29] = 'f'; 
	a1[17] = 'r'; 
	a1[24] = '_';
	a1[1] = 'c';
	a1[25] = '@';
	a1[27] = 'e';
	printf("%s", a1);
}

image

很烫

标签:char,TreeNode,struct,int,病假,a1,2020,WUSTCTF,root
From: https://www.cnblogs.com/kelec0ka/p/17889103.html

相关文章

  • 2020年高考数学真题一题多解
    (2020理科数学20)已知\(A,B\)为椭圆\(E:\dfrac{x^2}{a^2}+y^2=1(a>1)\)的左右顶点,\(G\)为\(E\)上的上顶点,\(\overrightarrow{AG}\cdot\overrightarrow{GB}=8,P\)为直线\(x=6\)上的动点,\(PA\)与\(E\)的另一个交点为\(C\),\(PB\)与\(C\)的另一交点为\(D\).(1)求\(E\)的方程(2)......
  • BUUCTF-RE-49-[羊城杯 2020]easyre
    BUUCTF-RE-[羊城杯2020]easyre进入main,简单分析之后进入encode_oneint__cdeclmain(intargc,constchar**argv,constchar**envp){intv3;//eaxintv4;//eaxintv5;//eaxcharStr[48];//[rsp+20h][rbp-60h]BYREFcharStr1[64];//[rsp+50h]......
  • 2020云计算省赛总结
    前言:本文写于2020/11/2915:25分,写这篇文章的目的有三:1、对专科两年所学做个总结2、让未来能有机会参加竞赛的同学有个参考3、浮躁的社会,需要静下心来思考author:JackSparrowdate:2020/11/292020云计算省赛总结一、私有云部署运维1划分compute磁盘2配置网络、主机名3配置yum......
  • RuCode 2020 Division A+B. I ✖ [PR #5] 和平共处
    前言认认真真学习了一下这道题相关的做法以及有关的二分图网络流理论,感觉自己又刷新了一些东西的理解。所以说我们就从普通的二分图匹配开始吧!二分图匹配众所周知,二分图最大匹配可以用网络流Dinic算法做到\(O(m\sqrtn)\)的复杂度。在某些特定的图下,我们有一种“贪心流”......
  • AutoCAD .NET 二次开发(2020版)找到折线上剩余的顶点
    如果一条折线有两个顶点,已对其中一个顶点应用了圆角,则还剩下一个顶点。 如何通过代码找到这些剩余的顶点(可能不止一个)?可通过遍历所有顶点,判断每个点连接的两边的线是否为直线如果都为直线,则为顶点,不是圆角。代码如下:for(inti=1;i<polyline.NumberOfVertices-1;......
  • AutoCAD .NET 二次开发(2020版)选择特定对象另存为新文件
    如果需要从当前模型空间中选择部分图形,直接另存为一个新文件,可用如下方法//spObjectId对象的ID//path保存路径//注意,实际内部使用了ObjectIdCollection对象,一次可以保存多个IDpublicstaticvoidSaveObject(ObjectIdspObjectId,stringpath){varsourceDb=spOb......
  • AutoCAD .NET 二次开发(2020版)在模态窗口中控制窗口的隐藏和显示
    如果你创建了模态窗口,虽然一些API,例如Editor.GetSelection(),可以自动隐藏模式对话框,但如果从模态窗口出发与编辑器(编辑器指的模型空间,即你绘图的窗口)交互,它会在GetSelection()完成后立即显示对话框,而你的其它代码可能仍在进行中,两者处于异步模式。由于模式对话框很可能在其它代......
  • Web_BUUCTF_WriteUp | [ACTF2020 新生赛]Exec
    题目分析随便ping一个ip:发个串试试输入;netstat:不过滤输入,直接把输入作为命令执行了。看来是命令执行漏洞。输入;dir:输入;ls:判断为linux系统的命令执行漏洞,当前目录下只有这一个php文件。先看看根目录都有哪些文件夹可走,输入;ls/:发现flag!输入;ls......
  • P8706 [蓝桥杯 2020 省 AB1] 解码 ( 入门 ) 题解
    题目传送门思路:有一个原串\(t\)。将原串\(t\)转换成简写字符串\(s\)的规则如下:如果有连续的\(2\sim9\)个相同字母,那么可以将它改为字母+数字的格式。如果是单独的字符,也就是与左右两边的字母都不相同,在简写字符串中一模一样。所以,现在告诉我们简写字符串,要我们求出......
  • AT_pakencamp_2020_day1_f Fibonaccyan(暂无评定) 题解
    题目链接题目大意:给定数\(P\),寻找能把\(P\)整除的最小的斐波那契数,然后输出它是斐波那契数列中的第几个,找不到输出的话就输出-1。分析:主要代码:a[i]=(a[i-1]+a[i-2])%p思路:先将\(a\)数组的第一项和第二项都初始化为1,然后判断是不是能整除\(p\)就行了Code:#incl......