Loading... 1. 这种GetPC的方法,它的缺点是:( A ) 00FD1481 E8 00000000 CALL testWin3.00FD1486 00FD1486 58 POP EAX ``` A. 会产生很多0x00,很有可能被截断指令 ``` ``` B. 会产生冗余指令 ret,导致ShellCode不能正常执行 ``` ``` C. 破坏栈顶0xC个字节数据 ``` ``` D. 会产生冗余指令 INC EBX ``` 2. 这种GetPC的方法,它的缺点是:( C )E8 FFFFFFC358 00FD1488 E8 FFFFFFFF CALL testWin3.00FD148C 00FD148D C3 INC EBX 00FD148F 58 POP EAX ``` A. 会产生冗余指令 ret,导致ShellCode不能正常执行 ``` ``` B. 会产生很多0x00,很有可能被截断指令 ``` ``` C. 会产生冗余指令INC EBX ``` ``` D. 破坏栈顶0xC个字节数据 ``` 3. 这种GetPC的方法,它的缺点是: ( C ) 00FD1493 D9EE FLDZ 00FD1495 D97424 F4 FSTENV PTR SS:[ESP-0xC] 00FD1499 58 POP EAX ``` A. 会产生很多0x00,很有可能被截断指令 ``` ``` B. 会产生冗余指令 INC EBX ``` ``` C. 破坏栈顶0xC个字节数据 ``` ``` D. 会产生冗余指令 ret,导致ShellCode不能正常执行 ``` 4.阅读以下VC6下DeBug(VC6下变量与变量之间是连续排列的)版本的源代码,其在XP和win7下运行的结果是:( A ) ``` int fun1() { printf( "Hello 15PB!\n" ); return 0; } int fun() { int p[ 1 ] = { 0 }; p[ 2 ] = ( int ) fun1; return 0; } int main() { fun(); printf( "HelloWorld!\n" ); return 0; } ``` ``` A. 输出Hello 15PB!\r\n后崩溃 ``` ``` B. 输出HelloWorld!\r\n后崩溃 ``` ``` C. 输出Hello 15PB!\r\n ``` ``` D. 输出HelloWorld!\r\n ``` p[2]覆盖掉了返回地址 5.以下代码片断哪个是调试ShellCode的错误方法( A ) ``` A. __asm { mov eax,bShellCode; push eax; ret; } ``` ``` B. __asm { lea eax,bShellCode; jmp eax; } ``` ``` C. __asm { lea eax,bShellCode; call eax; ret;} ``` ``` D. __asm { lea eax,bShellCode; push eax; ret; } ``` 6.对于ShellCode的描述不正确的是:( D) ``` A. ShellCode的体积要尽可能的小 ``` ``` B. ShellCode最好不要包含容易截断指令的字节 ``` ``` C. ShellCode是一段可以被执行的OPCODE ``` ``` D. ShellCode可以随意编写,一定都能被正确执行。 ``` 7.ShellCode中包含有一些自己需要用到的全局数据(例如字符串),如何保证在EIP指向ShellCode时,ShellCode能准确找到需要的数据?( C ) ``` A. 直接把需要的数据地址以硬编码的方式保存在ShellCode中 ``` ``` B. 通过调试的方法,记录数据在内存当中的位置 ``` ``` C. ShellCode代码流程中使用GetPC技术获取到当前代码的EIP,然后通过基于该EIP的偏移找到需要的数据地址。 ``` ``` D. 使用GetProcAddress获取所需数据地址。 ``` 8.ShellCode获取自身需要而当前程序没有导入的API的方法:( B ) ① 通过FS寄存器找到当前的TEB ② 在结点地址内存偏移0x08的位置取出Kernel32.dll或KernelBase.dll的基址 ③ 通过TEB偏移0x30的位置找到PEB的地址 ④ 遍历Kernel32.dll或KernelBase.dll的导出表,获取GetProcAddress函数的地址 ⑤ 通过PEB偏移0x0C的位置找到PEB_LDR_DATA的结构体指针 ⑥ 使用GetProcAddress这个API获取到LoadLibrary函数的地址 ⑦ 通过PEB_LDR_DATA偏移0x1C找到结构体的成员InInitializationOrderModuleList,此成员按照初始化顺序保存着进程加载模块的信息 ⑧ 使用LoadLibrary和GetProcAddress获取其它所需API的地址 ⑨ 通过InInitializationOrderModuleList找第1个结点头指针(第0个是ntdll.dll,第1个是Kernel32.dll或KernelBase.dll) ``` A. ⑨⑧⑦⑥⑤④③②① ``` ``` B. ①③⑤⑦⑨②④⑥⑧ ``` ``` C. ①②③④⑤⑥⑦⑧⑨ ``` ``` D. ②④⑥⑧①③⑤⑦⑨ ``` 9. 阅读以下VC6下Release版main函数反汇编代码片断回答9、10两个问题 00401000 push ebp 00401001 mov ebp,esp 00401003 sub esp,20h 00401006 push ebx 00401007 xor ebx,ebx 00401009 push esi 0040100A push edi 0040100B mov dword ptr [ebp-20h],407060h 00401012 mov dword ptr [ebp-4],ebx 00401015 mov esi,dword ptr fs:[30h] 0040101C mov esi,dword ptr [esi+0Ch] 0040101F mov esi,dword ptr [esi+1Ch] 00401022 mov esi,dword ptr [esi] 00401024 mov edx,dword ptr [esi+8] 00401027 mov dword ptr [ebp-4],edx 0040102A mov edi,dword ptr [ebp-4] 0040102D mov dword ptr [ebp-0Ch],ebx 00401030 mov dword ptr [ebp-10h],ebx 00401033 mov eax,dword ptr [edi+3Ch] 00401036 mov eax,dword ptr [eax+edi+78h] 0040103A add eax,edi 0040103C mov edx,dword ptr [eax+1Ch] 0040103F mov ecx,dword ptr [eax+20h] 00401042 add edx,edi 00401044 add ecx,edi 00401046 mov dword ptr [ebp-1Ch],edx 00401049 mov edx,dword ptr [eax+24h] 0040104C mov eax,dword ptr [eax+18h] 0040104F add edx,edi 00401051 mov dword ptr [ebp-18h],edx 00401054 xor edx,edx 00401056 cmp eax,ebx 9.1 对这段代码的描述准确的是:( C ) ``` A. 这段代码通过PEB获取了KernelBase.dll的模块基址,并获取了它的导出表的EAT,ENT,EOT的地址,导出函数数量,并将导出函数数量与0进行比较,猜测之后要循环遍历导出表 ``` ``` B. 这都是些啥?(╯‵□′)╯︵┻━┻ ``` ``` C. 这段代码通过PEB获取了Kernel32.dll的模块基址,并获取了它的导出表的EAT,ENT,EOT的地址,导出函数数量,并将导出函数数量与0进行比较,猜测之后要循环遍历导出表 ``` ``` D. 这段代码通过PEB获取了初始化模块链第[1]项的模块基址,并获取了它的导出表的EAT地址,ENT地址,EOT地址,导出函数数量,并将导出函数数量与0做比较,猜测之后要循环遍历导出表 ``` 10.标准PE文件在加载到内存中后,导出表的分布情况是:( C ) ``` A. 导出表所在VA:ImageBase + 0x3C 导出地址表RVA:导出表VA+0x1C 导出名称表RVA:导出表VA+0x20 导出序号表RVA:导出表VA+0x24 导出函数数量:导出表VA+0x18 ``` ``` B. NT头所在VA:ImageBase + 0x3C 导出表所在VA:ImageBase + [NT头VA + 0x78] 导出地址表RVA:导出表VA+0x1C 导出名称表RVA:导出表VA+0x20 导出序号表RVA:导出表VA+0x24 导出函数数量:导出表VA+0x18 ``` ``` C. NT头所在VA:ImageBase + [ImageBase + 0x3C] 导出表所在VA:ImageBase + [NT头VA + 0x78] 导出地址表RVA:导出表(VA)+0x1C 导出名称表RVA:导出表(VA)+0x20 ``` ``` D. 我哪里看的懂啊?(╯‵□′)╯炸弹!•••*~● ``` 11. 在去掉随机基址,不考虑DEP保护前提下。当某个应用程序在栈中发生溢出崩溃时,我们能通过调试的手段得到这个异常偏移,但是,为了ShellCode每次都能正确执行,那么,要命中这个溢出点,应该:(D ) ``` A. 这个异常偏移在不同的环境下并不通用,所以无法获取到。 ``` ``` B. 只能通过调试的手段获取这个溢出点 ``` ``` C. 把操作系统拖到OD里逆向一遍 ``` ``` D. 使用跳板指令,把溢出点的内容替换为JMP ESP所在的地址 ``` 12.我们在对栈溢出点测试时,为了定位异常点,常用的快速做法是( A ) ``` A. 使用有序数进行Fuzz,然后定位这个异常信息的偏移[这里的有序数a~z或者其他数字] ``` ``` B. 使用OD不停的调试 ``` ``` C. 使用IDA把溢出点的函数都逆向一遍,直接找到溢出原因 ``` ``` D. 通过系统的应用程序日志里观察错误,其中的异常偏移值就是溢出点 ``` 13.在使用Hash算法对Payload进行瘦身时说法错误的是:( B ) ``` A. 尽量避免生成的摘要中有0x00等截断指令的字节 ``` ``` B. 没有什么需要注意的地方,可以根据自己的意愿编写算法 ``` ``` C. 算法的设计要让结果尽可能的不发生碰撞 ``` ``` D. 计算摘要的算法要尽可能的简单 ``` 14.BindShell能正确将远程的输入置于目标机器上的原理是:(C ) ``` A. Telnet命令自动重定向目标机器的输入输出 ``` ``` B. ShellCode本来就是这样的 ``` ``` C. 我们的ShellCode会使用CreateProcess函数,而这个函数中有一个参数是STARTUPINFO的结构体指针,这个结构体里设置字段dwFlags为STARTF_USESTDHANDLES,这样就把目标的标准输入输出重定向到了我们绑定的套接字上。 ``` ``` D. 远程套接字自带这种功能。 ``` 15.对于测试能运行的ShellCode,在Payload时,有些情况下运行时会发生意外情况,经过分析大多情况的原因是:( D ) ``` A. 系统出问题了,重装系统 ``` ``` B. ShellCode没有抠取完整 ``` ``` C. 分析出错,被测试程序并没有溢出点可利用 ``` ``` D. ShellCode中有0x00,0x0a,0x0d,0x20等指令截断字节 ``` 16.提取ShellCode的步骤是:( B ) ① 编译程序 ② 找到ShellCode开始的位置 ③ 在VS C++控制台工程中使用内联汇编编写ShellCode部分的指令 ④ 记录ShellCode结束的位置 ⑤ 使用x64dbg调试器调试编译好的程序 ⑥ 以C样式ShellCode方式复制数据 ⑦ 内存窗口中把记录下的开始和结束位置选中 ⑧ 找到main函数 ⑨ 将复制的数据粘贴赋值给刚才定义的字节数组 ⑩ VS C++工程中定义一个字节数组 ``` A. ③①⑤⑧②④⑦⑥⑩⑨ ``` ``` B. ①③⑤②⑧④⑦⑥⑩⑨ ``` ``` C. ①②③⑤④⑥⑦⑧⑨⑩ ``` ``` D. ③①⑤②⑧④⑦⑥⑩⑨ ``` 17.使用mona 插件查看指定模块的导入表 的方法是:( D) ``` A. !py mona eat ``` ``` B. !py mona eat -m xxx.xxx ``` ``` C. !py mona iat ``` ``` D. !py mona iat -m xxx.xxx ``` 18.使用Mona插件帮我们查找可利用的return-to-libc指令是:(D ) ``` A. !py mona ropfunc ``` ``` B. !py mona fw ``` ``` C. !py mona getpc ``` ``` D. !py mona rop ``` 19.使用Mona插件生成用于Fuzz的4000个有序数指令是:( C ) ``` A. !py mona po 0x4000 ``` ``` B. !py mona po 4000 ``` ``` C. !py mona pc 4000 ``` ``` D. !py mona pc 0x4000 ``` 20.使用Mona插件查找可使用跳板指令的正确方法是:( D ) ``` A. !py iat –m msvcr71 ``` ``` B. !py mona jmp –r esp ``` ``` C. !py mona find –s “\x94\xC3” –m msvcrt.dll ``` ``` D. !py mona jmp –r esp –m “kernel32.dll” ``` 最后修改:2021 年 04 月 26 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏
2 条评论
irohane你好,题目中的指令是存在问题的,这个指令完整的应该是 E8 FF FF FF FF C3 58
---------------------------------------------------
这种GetPC的方法,它的缺点是:
00FD1488 E8 FFFFFFFF CALL testWin3.00FD148C
00FD148D FFC3 INC EBX
00FD148F 58 POP EAX
感谢指正,