可以看到输入的字符被存储在0x804a060,然后程序跳转到0x804a160 的位置,所以通过输入覆盖0x804a160,在这个地方插入执行shellcode
查看文件的安全机制
不存在栈不可执行,就可以通过上面的思路进行——将shellcode放在栈上,然后执行shellcode
思路一:
通过上面的两个地址的间隔为0x100——先要构造随便的256个字符进行填充,然后执行shellcode
然后随便选一个写在256个字符的后面,那么当跳转的时候就自动运行,可以得到一个shell
注意:如果是这种思路要把shellcode执行的开始地点作为return时pop出来的值,在填充的0x100个填充字符之后,要先将返回地址(shellcode的首地址给出),然后再加上shellcode
思路二:
将随意填充字符“A”和shellcode一起组成256个字符
因为后面调用的时候就是转到dword_804a160()的位置来进行执行的,如果能让函数在调用这个函数的时候转到shellcode的地方执行,就可以拿到shell
因为调用这个函数的时候,先要把ds:dword_804a160地址的数据转到eax,然后执行,所以覆盖这个地址可以控制程序转到我们想要的位置,这里我们想要程序转到0x804060的位置,然后可以执行刚刚写好的shellcode
这种思路的好处是:通过改写程序中规定存在,可写的部分来执行shellcode,充分利用已有的空间
PS:
注意机器码和正常代码的顺序问题
在exp程序中
使用ljust函数填充‘a’,实际上的代码效果是
即机器码的左和通常意义上的左是不一样的