1.在IDA中跳转到指定地址的快捷键是()

J
CTRL+J
CTRL+G OD
G

2.List类模版中内存布局描述错误的是()

初始化0Ch个字节的空间
第二个字段直接指向添加的数据
第一个字段是一个指向自己的指针
第三个字段存放着元素的个数

3.vector类模版中内存布局描述错误的是()

初始化10h个字节的空间
第一个字段是一个指向自己的指针
第三个字段存放着元素的个数
第二个字段直接指向数据的数组

4.map类模版中内存布局描述错误的是()

第三个字段存放着元素的个数
初始化10h个字节的空间 0c
第二个字段指向数据的结构体
第一个字段是一个指向自己的指针

5.以下对这两条指令的描述错误的是()

Lea ecx,[ebp-0x24];

call 00401168;

mov edx,eax;

Edx保存函数的返回值
这是c++类成员函数的调用
这函数使用thiscall约定
选项都是错误的

6.对于全局对象,以下描述错误的是()

构造函数会早于main函数的开始
析构函数会在main函数结束后调用
构造只能在main函数内被调用
构造函数会在_initterm中被调用

7.string类模版中内存布局描述错误的是()

第二个字段是一个联合体,保存指向字符的指针或字符
初始化1Ch个字节的空间
选项都是错误的
第一个字段是一个指向自己的指针

8.vector的原理描述正确的是()

选项都是错的
它是一个双向链表
它是一个二叉树
它是一个动态数组

9.List的原理描述正确的是()

它是一个动态数组
它是一个双向链表
选项都是错的
它是一个二叉树

10.map的原理描述正确的是()

它是一个动态数组
选项都是错的
它是一个二叉树
它是一个双向链表

11.从逆向角度讲,以下不属于构造函数的特点的是()

没有返回值
全局对象的构造在_initterm函数完成。
返回值是this指针
初始化缓冲区(清0)

12.从逆向角度讲,以下属于析构函数的特点的是()

析构函数一般作用释放资源
选项都是对的
局部对象,会在函数返回前,调用析构
全局对象的析构是在exit函数中完成的

13.从逆向角度讲,不属于成员函数的特点()

访问或者修改成员变量,一般都是使用this指针加上偏移来实现。
获取成员变量的函数,一般返回值是从 this 指针指向的内存空间中获取的。
this指针存一般放在edx中 ecx
设置成员变量的函数,一般参数传递进去之后会修改 this 指针所指向的内存空间。

14.静态函数与友元函数的特点描述错误的是()

友元函数一般参数都是某个对象,或对象指针。
静态函数,没有this指针,没有ecx传参。
静态函数的两种调用在反汇编都是一样的
友元函数,会传递this指针,ecx传参。 传递的是对象指针

15.关于虚函数表描述错误的是 ()

程序编译时,会自动生成虚函数表。
一个类对象的内存中可能存在多个虚表指针 虚函数表=虚表
如果类中存在继承时且都有虚函数,那么只会共用一个虚函数表。
虚函数表一般存在只读数据段(.rdata)

16.关于初始化和访问虚函数表错误的是()

当父类指针指向子类对象时,虚函数调用才会访问虚函数表。
如果有继承关系,父类和子类虚函数一样,也会有两个虚函数表,他们的虚函数表指针都是在各自的构造函数中初始化的。
构造函数中会初始化本类的虚函数表指针。
直接调用本类中虚函数,也会使用虚函数表访问虚函数。

  1. // 006_菱形继承.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. //
  3. #include <iostream>
  4. using namespace std;
  5. class A {
  6. public:
  7. virtual void fun()
  8. {
  9. std:cout << "A:fun\n";
  10. }
  11. virtual void funA()
  12. {
  13. std:cout << "A:funA\n";
  14. }
  15. };
  16. class B1 : public A {
  17. public:
  18. virtual void fun()
  19. {
  20. std:cout << "B1:fun\n";
  21. }
  22. virtual void fun1()
  23. {
  24. std:cout << "B1:fun1\n";
  25. }
  26. virtual void fun2()
  27. {
  28. std:cout << "B1:fun2\n";
  29. }
  30. };
  31. class B2 : public A {
  32. public:
  33. virtual void fun()
  34. {
  35. std:cout << "B2:fun\n";
  36. }
  37. virtual void fun3()
  38. {
  39. std:cout << "B2:fun3\n";
  40. }
  41. virtual void fun4()
  42. {
  43. std:cout << "B2:fun4\n";
  44. }
  45. };
  46. int main()
  47. {
  48. A* p1 = new A;
  49. A* p2 = new B1;
  50. A* p3 = new B2;
  51. p1->fun();
  52. p2->fun();
  53. p3->fun();
  54. p1->funA();
  55. return 0;
  56. }

image.png

探索虚函数表.md.pdf

17.在MFC界面程序中如何快速有效的定位到关键代码调用处()

跟踪main函数
特征码识别
字符串搜索
api断点

18.不能用来识别一个程序是什么编译环境()

OEP特征
exe的名称
区段名称
链接器版本

19.逆向分析的方法有那些()

① 自上而下,单步跟踪

② 自下而上,下断栈回溯

③ 字符串分析

④ 源码对比

①②③
①④
①②④
①②③④

20.OD中使用那个快捷键复制二进制代码()

Shift+X
Shift+B
Ctrl+X
Ctrl+S