系统级编程lab5.docVIP

  • 90
  • 0
  • 约 7页
  • 2017-02-09 发布于重庆
  • 举报
Practice1 上周做了,复制过来。前面得key1=3、key2=777 下面我们继续往后面看代码,并且通过提示我们了解到我们需要想办法使程序进入并执行msg2 = extract_message2(start, stride); 但是从正常的程序逻辑上看,我们无法使msg1为空而顺利进入到条件码中。那么我们需要考虑应该在process_keys34中做出调整。我们能否在执行完process_keys34后偷偷的改变msg1的值呢?在看了这段函数的代码后,我们发现这个函数中两个变量的范围相差太大了,一个是全局变量message(msg1的实际指向),一个是局部变量key3。那么我们需要换一个思路,能否让函数在返回的时候直接跳转到目标代码呢?如果要这么做,我们就需要修改程序在运行过程中的栈帧结构中的存储数据了。现在让我们来分析一下程序在调用process_keys34之前的栈帧结构: 从汇编码中我们可以看到在调用之前整个栈帧结构中数据的存储细节。首先是将参数key3、key4压入栈中保存,然后在传入这些参数。然而这些参数的传递都是传地址的,所以我们在process_keys34中可以通过key3的相对定位来改动调用者的栈帧数据。 在这之前让我们来想想调用时的栈帧结构: 我们可以看到,如果我们能够修改返回地址使它返回到我们期望的位置就可以了。那么我们现在需要确定这个返回地址相对于key3的距离是多少,通过图我们可以看到这个地址就在key3的下面,只需要在key3基础上减一(这个减一是在int下的,实际上在地址层面应该是-4)就好了。所以我们得到了key3的值-1. 另外我们需要感谢出题者,他一直给我们提供充足的相对数据。在这里我们只需要在原返回地址上面加上一个合适的值就好了。 从上图中,我们可以看到原先的返回地址和我们需要抵达的返回地址0040138e是原先保存在栈帧中的返回地址,而我们期望程序返回时直接到达0x004013bb。这样我们就得到了key4的具体值: Key4=(0x004013bb-0040138e)/4=45。 所以key1234分别就是 3 777 -1 45。 Practice2 push ebp 将ebp压入栈顶位置。EIP跳栈顶ESP变为0091FD68 movebp,esp 将ESP的值赋值给EBP,栈底EBP变为0091FD68 sub esp,0D8h 将ESP的值减小0D8h,变为00D2FBF8 push ebx 0095185A push esi 0095185B push edi 将当前的EBX,ESI,EDI值逐个压入到栈里。得到ESP为00D2FBEC Main() 0095185C lea edi,[ebp-0D8h] EDI=EBP-0D8h为与栈底相隔0D8hbytes的位置 mov ecx,36h 将ECX赋值为36h. mov eax,0CCCCCCCCh 将EAX赋值为0CCCCCCCCh 0095186C rep stosdwordptres:[edi] 从EDI的位置开始赋值,每次EDI+4,ECX-1,直到ECX为0为止。执行完后EDI=00D2FCD0、EFL 0095186E movdwordptr [a],1 将1赋值给a的位置 movdwordptr [b],2 将2赋值给b的位置 0095187C moveax,dwordptr [b] 将(b位置中的)2赋值给EAX 0095187F push eax 将EAX放入栈中, ESP变为00D2FBE8 movecx,dwordptr [a] 将(a位置中的)1赋值给ECX push ecx 将ecx压入栈顶,ESP变为00D2FBE4 call swap1 (0951307h) 执行swap1函数 add esp,8 ESP加8,ESP变为00D2FBEC 0095188C moveax,dwordptr [b] 将(b位置中的)2赋值给EAX 0095188F push eax 将eax压入栈顶,esp变为00D2

文档评论(0)

1亿VIP精品文档

相关文档