C++多态和文件读写
多态多态是C++面向对象三大特效之一
多态的基本概念多态分为两类:
静态多态:如函数重载,运算符重载
动态多态:派生类和虚函数实现运行时多态
静态多态和动态多态的区别:
静态多态的函数地址早绑定,编译阶段确定函数地址
动态多态的函数地址晚绑定,运行阶段确定函数地址
补充:子类可以成为父类的引用,例如当一个函数传入父类的引用时,在调用函数时可以传入子类。
举个例子讲讲什么是动态多态,什么又是地址晚绑定。例如,当我们创建一个动物类(父类)时,在类内写了一个void函数void what( ),输出I am animal,这时我们再写一个子类猫,在猫类内也写一个同名的函数输出I am cat。这时写一个传入父类引用的函数,调用函数时传入子类猫。正常来说,此时函数会输出I am animal,这个属于静态多态,函数what 的地址早在编译阶段就绑定animal.what( )里的I am animal了。
我们自然是想要输出I am cat 的,这时候就要用动态多态,让地址晚绑定,在运行阶段时绑定地址,根据具体的子类执行对应的函数。
要满足动态多态的条件 ...
beginCTF
前言这次不太好评价,感觉对我来说是降维打击,首先感谢队里的所有朋友们,是你们的陪伴和互助我才能坚持下去。
0x01红白机看文件标题,猜测是6052汇编语言,作为上世纪的古老汇编,我自然是看不懂的,这里有个网址能运行6052汇编
如果感兴趣还有教学,该博客对6052汇编的介绍还是有理有据的。
flag{6502_I_LOVE_u}
0x02xor出题人说是简单的异或,我点进去一看一坨,不想看了,既然说是异或那就用异或试试看。
找到这个极其可疑的字符串
点进去打个断点调试,要你输入flag时,就把这串字符串输入进去,结果肯定是错的,但是由于异或的可逆性,这时候查看enc的值,就是正确的flag,手抄下来得到答案(偷懒取巧的做法,不可取:( )
flag{Virus_gonna_be_terminated!}
0x03real checkin xor借这又一道异或题记录一下静态做法,这题的函数相比之下就人性化许多了,一眼能看出加密过程
记录一下源码
12345678910111213def verify_func(ciper,key): encrypted = [] fo ...
C++继承
C++继承本节介绍C++的继承和多态的语法
继承方法一图解
继承中的对象模型一句话,在继承中,父类的私有成员只是被隐藏了,占存储空间,还是会被继承下去。
12345678910111213141516class Base{ public: int a; protected: int b; private: int c;};class Son: public Base{ public: int d;};void test(){ std::cout<<sizeof(Son)<<endl; //输出16 }
构造和析构的顺序构造和析构的顺序,先构造父类,再构造子类;先析构子类,最后再析构父类
同名成员处理当子类和父类出现同名的成员时:
若访问子类同名成员,直接访问即可;若访问父类同名成员,需要加作用域。
123456789101112131415161718192021class Base{ public: Base(){ a=100; } int a; ...
GeekChallenge 2023 re wp
前言感觉有点尴尬,这个wp并不全,因为本人打算在比赛结束后写出此文,然后发现靶场的题全下完了,然后自己也没有备份,呃呃怎么办呢?只能凭印象了,想到哪道题就写哪道题罢,然后Ida的界面的东西也没有(因为题目被我删了)只剩解密脚本了凑合着看。。。
0x01 shiftjmp
die查壳,发现是无壳的ELF64文件,直接拖入ida64
按tab发现无法生存伪代码,发现这里有两处错误。
这两处错误是花指令,花指令详情见花指令 - CTF Wiki (ctf-wiki.org)
第一处是无意义跳转,第二处是jmp造成的脏字节。
把jz和imp都nop掉。
undefine (U)然后按 c生存代码 按p生存函数main
非常简单的异或加密,写个python脚本解密
12345enc='SXAxS6jd8doTxBQ{x"Ma'+chr(0x27)+r"csE-|El,o/{^\\"flag=""for i in range(34): flag+=chr(ord(enc[i])^i^0)print ...
nbctf
0x01 py逆向给了一个main.py和out.txt 的文件,打开分析一下
12345678910111213141516171819202122232425import random key1 = random.choices(range(256), k=20) #0到255里取20个随机数key2 = list(range(256)) #0到255的列表random.shuffle(key2) #随机排列flag = open('flag.txt', 'rb').read() #读取flag,设置成input def enc(n): #加密函数 q = key2[n] w = key1[q % 20] n ^= q return n, w x = 0x00000000for i, c in enumerate(flag): #枚举遍历,第一个是下标,第二个是里面的东西 x <<= 8 #x左移动8位,一个字节 n, w = enc(c) #根据密钥和flag出两个数 i ...
CPP类的基础
构造函数和析构函数函数名和类名相同,有参数,构造函数创建对象时会自动调用且只调用一次,而析构函数在对象销毁前会自动调用一次,这两个函数是必需的,如果不手动设置,编译器会自动设置
1234567891011//构造函数class Person{ public: Person(){ std::cout<<"OK"; } //析构函数 ~Person(){ std::cout<<"OK"; }};
构造函数的分类默认无参构造函数,有参构造函数,拷贝构造函数
调用方法有括号法显示法和隐式转化法
1234567891011121314151617181920212223242526272829303132333435class Person{ public: Person(){ //无参 } Person(int a){ //有参 } Person(const Person &am ...