重新编译后调试,可以发现test()函数会返回到MOV EAX, 1 RET,继续单步运行,执行完MOV EAX后会跳到关闭DEP的代码处。继续运行会出现access violation when writing to [9090908C],这是因为shellcode直接用0X90909090将EBP给覆盖了,EBP-4=0X9090908C,这个地址是不能写的,所以执行到MOV DWORD PTR SS:[EBP-4],ESI时会报错。
接下来要在执行关闭DEP的代码之前要把EBP-4地址处修改为一个可以进行写操作的地址。可以使用PUSH ESP, POP EBP, RETN指令来修改EBP并且修改完后还能回收控制权。这条指令序列可以使用OllyFindAddr插件来查找,查找结果中的step3。这里选择的地址为:0X77F238FF