title: 攻防世界 logmein(重点在于怎么写出脚本)
date: 2021年8月6日 16点08分
tags: 攻防世界
categories: 攻防世界
1、重温之前言
这道题之前,做过,但是所写的脚本是依照他人的,今日,想自己写脚本做出来这道题,便重温一遍,重点在于写脚本过程,以此记录自己学习之路,之前做这道题的时候,对于写脚本可是一点点思路也没有,今日再做,虽没一下成功,但是也算了勉勉强强可以接近写出脚本了。
前面的找到伪代码一系列过程,请移步我之前写的博客的第一题
攻防世界+BUUCTF几道reverse新手题(需要复写代码)_啥也不会的大白555的博客-CSDN博客
下面开始分析伪代码,
随着之前分析的几个reverse题,如今的这个伪代码的内容便是一眼并知了。
**关于v7 这里的小端序存储,一开始并没有想起来,导致写脚本的时候,出现了错误。**这是需要铭记的地方,下次一定要记住,在IDA中,需要自己手动来转为字符串的,一定要反转一下,字符的顺序。
关于大小端序的问题,请移步之前写的博客
BUUCTF SimpleRev(涉及大小端序存储的问题)_啥也不会的大白555的博客-CSDN博客
此是后话,继续分析。
如图所示,我们整理一下思路,输入的s 是flag,然后通过if语句中的那一串算法,将s加密。在算法中,v6,v7,v8已经告诉,我们则正向的写脚本跑一下就可得flag。
2、错误的脚本摸索 一
一开始写的代码如下
**我知道,把v8字符串写出来,把v6写出来,把v7写出来,然后根据循环,跑一下这个算法便可得到答案,但是出错了,学过c语言的应该都知道,这里的这个错误是说,我们在^(异或)的时候,两边的类型不一样。**我在想,之前抄其他大佬们写的脚本怎么没有这个问题呢。在百思不得其解的情况下,我打开了之前写的博客,查看它的脚本代码。如图:
3、再次参考大佬写的正确的脚本
4、发现问题所在,&v7前面还有一串字符
此处我忽略了一个问题,伪代码中的算法不仅仅是有v7,v6,v8,还有v7前面的一串东西,于是我天真的加了上去。
观察错误,发现它说这个_BYTE,第一次被使用,没有声明定义。
5、关于_BYTE的宏定义问题
于是我又去观察之前大佬写的。发现他前面写了一个宏定义#define BYTE unsigned char,我加了上去,发现成功了,且没有错误的地方,但是加密出来的flag不对。
为什么宏定义之后能成功,见下面复盘阶段的解释。
6、此处就是v7字符串没有反序,引起的错误
这时我还以为,v7必须得用那一串数字,才可以,于是修改代码。
7、发现__int64 的不一样,要两个下划线
出现错误,百度一波_int64,发现就是一个无符号的64位整数,与int是一样的。
但是在c语言中,注意前面的那个_ ,在c语言中,要写两个_ _
成功得出结果。
8、再次复盘
(1)BYTE的问题
此处再次复盘这个过程,百度了一下BYTE。
标准C没有这个类型,byte表示一个字节,对应C的unsigned char,你可以自己按下面的样子定义一个即可:
typedef unsigned char byte;,也就是我们宏定义的#define _BYTE unsigned char
(2)算法的问题
在写脚本的时候,一定要将算法里面的东西都复制,不要自己去写,容易出错。
对于v7的类型,我也在伪代码的一开始找到了。
除此代码之外,还有另外一个代码,v7有__int64类型,变成了char 类型。
(3)还可以将v7变成字符串,但是记得字符串要反序
但是这里,一开始忘记了小端序存储,在这里,需要变换字符的顺序,所以加密失败了。
这里,我是后面查看了大佬的wp之后,才顿然醒悟。
换个顺序,就成功了。
也就是说v7不管是__int64类型的一串数字,还是char类型的字符串,算法都是能成功的。
9、总结
(1)关于头文件中,有#include <stdlib.h> 这个头文件的解释
那位大佬在脚本中加了一个system(“PAUSE”);在使用system的时候,需要加上这个头文件,这行代码的作用是,防止程序一下就退出。
脚本写在这里就结束,这次重温收获很大,
(2)第一是学到了在写脚本的时候,可以选择加入system(“PAUSE”);
这一行代码,防止代码快速闪退,但是得加上头文件#include <stdlib.h>