C++面向对象基础——继承
C++面向对象基础——继承
继承面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。
当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
继承的权限和作用域C++中的类也是可以继承的,用冒号标识继承的类,并且还可以表时是以什么权限(public,private,protected)去继承的。
公有继承:继承父类的 public 和 protected 的所有方法和成员,保持权限不变。
保护继承:继承父类的 public 和 protected 的所有方法和成员,权限全部改为 protected
私有继承:继承父类的 public 和 protected 的所有方法和成员,权限全部改为 private
继承之后,子类可以使用父类的所有方法和成员。在不指定命名空间的时候,优先访问本类命名空间的方法和成员,否则逐级向父类寻找,第一个找到的会被调用。
我们也可以在成员名或者方法 ...
KCTF2022秋季赛第二题——盗贼作乱题解
KCTF2022秋季赛第二题——盗贼作乱题解
外层分析序列号形式,先拿 ida 上手
输入部分应该就是,会先找到一个 -,所以序列号的形式是
1xxxxxxx-xxxxxx
然后下面进行一大波判断,逐一下断点动调分析。
遇到的第一个函数,经过反复动调,确定是找表得到下标值,有点像 base62 感觉,并且传的第三个参数也很像 base62 的表
最后确定应该是 62 进制的一个转换,结果保存在第一个参数,并且保存的地址类似一个结构体,第一个 int 为长度,往后都是 int 型存储,这边把结构体定义一下,改改。
12345struct number{ int len; int num[8];};
里面有一个常数,是由 IRtzloZ6iuB 字符串转换而来,把它转 10 进制发现它的值刚好是:
110000000000000000000
下面那个函数经过动调之后,发现只是把结构体设置了一下,所以我叫它 set_number。
最下面还有一个函数,它对我们之前转换的三个数字做了比较,并且需要返回结果都小于 0。
其实不难想到,先判断长度,大 ...
C++面向对象基础——运算符重载
C++面向对象基础——C++基本用法&运算符重载
C++基础知识命名空间namespace,C++ 为我们提供了一个允许我们定义在不同作用域的同名函数。我们可以用如下定义:
12345namespace name{ void f1(); void f2(); ...}
通过以上的申明我们可以在 namespace 外调用函数,通过如下方式调用
12name::f1();name::f2();
C++还有 using 关键字,使用 using 之后,我们不必通过以上方式调用,而是可以直接使用它的函数名调用。比如我如果在调用 f1() 之前用了 using namespace name;
那么我就不需要再用 name::f1() 了,而是可以直接使用 f1() 调用指定函数。
namespace 可以嵌套定义。
函数重载C++开始已经支持了同名函数的存在,在相同 namespace 下也可以定义同名的函数,只要参数类型不一样即可,它会根据你调用的方式选择合适的重载函数,主要是因为 C++ 有一个名称粉碎机制,它会根据你的参数名和参数个数 ...
护网红队面经
就随便上传一篇护网面经
红队反弹shellhttps://zhuanlan.zhihu.com/p/138393396
https://www.anquanke.com/post/id/87017
OWASP TOP 10https://blog.csdn.net/fly910905/article/details/120541498
https://www.cnblogs.com/zhijiya/p/15142003.html
shiro反序列化https://www.cnblogs.com/xiaozi/p/13239046.html
shiro在路径控制的时候,未能对传入的url编码进行decode解码,导致攻击者可以绕过过滤器,访问被过滤的路径
反序列化
aes key泄露 版本<1.2.4 key都为默认key rememberMe字段,使用密钥构造一个payload最后在不断地解密后到达readobject()
访问http://127.0.0.1/admin 的时候,页面返回403。因此可以确定admin路径是属于被过滤路径。此时使用burp截断,然后在访问路径 ...
关于Linux一些IO的细节
写这篇博客的原因是在考试中遇到一个很 细 的题目。
题目题目长这样
问最后的运行结果,当然有 fork 存在肯定是多种情况的,当时乍一看这一题,就很自信地写了
xbay ,xaby,xayb
结果却是一个大红叉子,我细数也就四次输出,为什么答案长度为 5??
我运行一遍之后,发现结果:
纳尼,真的是 5 个,哪来的五个呢。
细细品味一下,原来有个天坑。
分析首先 Linux 的 C,它的缓冲区默认不初始化的,如果不初始化缓冲区,就会造成每隔一行才打印一次,或者是等到程序 exit 之后才打印。
如果在 Linux 下面有这样的语句
12printf("input");scanf("%s");
那么你大概率是看不到开头这个 input 的,只有程序结束了才能看到,原因就是调用的 IO 函数它会先把数据存到对应的 FILE 结构体上。
调试我们启动 gdb 调试一下,断在第一个 putchar 下面,在进去之前我们可以看到,stdout 没有初始化。
然后 putchar 内部调用一个 __overflow 函数
最后进入到 ...
windows网络编程——tcp套接字
TCP 是面向有连接的可靠传输协议,来讲讲它的一个 Windows 的基本实现。
学习笔记首先在 Windows 下 socket 编程要添加这样的预处理:
12# include<WinSock2.h># pragma comment(lib,"ws2_32.lib")
然后我们需要启动一下,一般加入以下代码即可:
123WORD wVersionRequested = MAKEWORD(2, 2);WSADATA lpWSAData;int nRet = WSAStartup(wVersionRequested, &lpWSAData);
为了程序健壮可以添加一些判断代码。
12345678910if (nRet != 0) { printf("WSAStartup Error!\n"); system("pause"); return 0;}if (LOBYTE(lpWSAData.wVersion) != 2 || HIBYTE(lpWSAData.wV ...
syspro4-远程线程注入的实现
之前呢细学习了一遍 dll 注入的流程,然而对于 dll 怎么注入进去还是一无所知,所以今天就刚好来学习一下。
动态链接库编写dll我们说 exe 和 dll 文件都是 PE 文件,一般 exe 只有导入表,dll 只有导出表。导入表会显示你导入了哪些 dll ,dll 中导入了哪些函数等等。dll 的导出表则会显示你这里有多少可以被导入的函数。
新建链接库,创建 h 文件,输入申明
1extern "C" __declspec(dllexport) int add(int num1,int num2);
主要是因为 C++ 有名称粉碎机制,因为 具有多态特性的C++支持函数的重载,函数不再以函数名称作为唯一标识。只要满足构成重载的条件,两个(或多个)功能不同的函数可以有相同的函数名称。这样一来,函数的调用者会获得多态性带来的极大方便(虽然函数的编写者的工作量没有改变,所有的同名函数仍需要一个一个地去编写)。构成函数重载的条件是:
作用域相同
函数名称相同
参数不同(类型,个数,顺序)(另外:返回值类型、调用约定类型并不作为参考)
为了支持函数重载这一新 ...
PE文件解析——导入表结构
PE第五课——导入表
课堂笔记上节课讲的是数据目录表,这节课是导入表,导入表好像是数据目录表的一种吧,也不清楚,暂时先这么理解。
现在需要用到库函数已经可以不需要导入表了,可以用 LoadLibarary 或者是 GetProcAddress 来获取函数地址直接使用,但是我们还是有必要学这个。
比较重要的结构体定义如下。
1234567891011121314151617181920212223242526272829typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; // 0 for terminating null import descriptor DWORD OriginalFirstThunk; // RVA to original unbound IAT (PIMAGE_THUNK_DATA) } DUMMYUNIONNAME; DWORD TimeDa ...
PE文件解析——数据目录表
PE第四课——数据目录表
课堂笔记在数据目录表中一般只关心导入表,导出表和资源这几个部分,但是资源实在是太复杂了,而且在一般的病毒木马中也不会存在资源,所以在这个工具中只是简单的解析了一下导出表和导出表。
在 VS 中,数据目录表的结构很简单。
1234typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; DWORD Size;} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
就是一个虚拟地址和大小的字段。
它是一个数组结构,用宏定义可以看见什么表在某个下标的位置。
RVA和FRVARVA 转化为 FRVA 主要是通过某个数据在内存中的相对偏移地址找到其在文件中的相对偏移地址,在对某个程序进行逆向时,如果找到关键的那个变量或者那句指令,我根据变量或者代码指令在内存中的 RVA 找到它在文件中的偏移,就可以找到它的位置,修改它可能就可以破解某个程序。
所以我们写一个 RVA 转为 FRVA 的函数。
它有这么几个参数:一个 ...
PE文件解析——区段表结构
PE第三课——区段表结构
课堂笔记区段表其实上节课就已经讲过了,这个区段呢我们能自己定义名字然后它在 PE 里面有内存地址偏移和文件偏移。我们需要用一个宏来从这个 NTHeaders 获取 SectionHeader。再从 NTheaders 中获取区段的数量 NumberOfSection。
然后就是根据结构体打印一些信息了)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#include<windows.h>#include<stdio.h>int main() { FILE* fd = fopen("C:\\Users\\xia0ji233\\Desktop\\Home\\C++\\test.exe", "rb"); char* buffer = (char*)malloc(0x10000); ...