mov指令的功能是传送数据,它可以把一个操作数的值复制到另一个操作数中。例如:lea
- mov eax, [ebp-18h],作用是将ebp-18h作为偏移地址,寻址找到内存单元,将该内存单元中的数据送至eax,类似于C语言中的eax=*(ebp-18h);
- mov [ebp-1ch],eax,作用是将eax中的数据送至ebp-1ch作为偏移地址所指向的内存单元 。类似于C语言中的*(ebp-1ch)=eax
lea指令的功能是计算有效地址,它可以把一个内存地址的值存入一个寄存器中。例如:ret
- lea eax, [ebp-18h],作用是将ebp-18h作为一个地址(而不是一个值),存入eax寄存器中。类似于C语言中的eax=ebp-18h;
- lea [ebp-1ch],eax,作用是将eax寄存器中的值(假设为12345678h)存入ebp-1ch作为偏移地址所指向的内存单元。类似于C语言中的*(ebp-1ch)=*eax。(这个用法和本题没啥关系,只是提一嘴)
这个应该都很熟悉了。ret指令的功能是从子程序返回,它可以把栈顶的值弹出并作为返回地址,跳转到调用子程序的地方。0x01 漏洞代码
mov eax, [ebp-88h]表示将ebp-88h处的内存值,也就是我们输入的值,假设为1h,传送到eax寄存器中,此时eax=1h在执行完这段代码后我们可以知道两件事:eax存放的值就是数组的地址;地址的最低八位的值就是我们输入的值
mov ecx, eax表示将eax寄存器中的值(1h)传送到ecx寄存器中,此时ecx=1h
lea edx, [ebp-70h]表示将ebp-70h作为一个地址传送到edx寄存器中,此时假设ebp=00100000h,则edx=000FF890h即数组基地址
mov eax, [ebp-7Ch]表示将ebp-7Ch处的内存值,也就是记录循环次数的i,第一次循环i为0,传送到eax寄存器中,此时eax=0
add eax, edx表示将edx寄存器中的值(000FF890h)加到eax寄存器中的值(0),这一步相当于找到arr[0]的位置,此时eax=000FF890h
mov [eax], cl表示将ecx寄存器中的最低8位(即cl,值为01h)传送到内存地址为eax=000FF890h的单元中
offset + system_addr + 0xdeadbeef + sh_addr但是在这题中我们能直接修改内存内容,因此只要把system_addr和sh_addr填到栈上的相应位置即可。注意:由于每次我们只能修改1字节,所以要分成多次将ROP链的内容填到栈上
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |