具体复现见参考1所示就行,主要讲几个需要注意的点。
1.对函数调用如何入栈需要弄清楚,尤其是调用函数和被调用函数栈帧的分布,注意栈的增长方向,我们一般说的栈是指从高地址向低地址这个方向延伸,每一个位置是四个字节,PUSH
入栈的时候,ESP-4
,POP
出栈的时候,ESP+4
。
2.因为不安全的函数,导致栈溢出。覆盖的时候是从低地址往高地址(被调用的不安全函数的栈帧往调用函数栈帧)依次覆盖。被调用函数执行完成后返回调用函数,此时ESP
应该指向shellcode
的开始部分(一般情况是这样,大部分情况shellcode可能被吃掉部分),这也是EIP
应该覆盖为JMP ESP
的机器码的原因。
3.溢出覆盖的时候,需要注意JMP ESP
是否能够指向shellcode
,有的时候shellcode
的开始可能会被吃掉一部分,最好是调试看一下,可能需要在shellcode
前面加一些NOP
字符;shellcode
编写的时候,会遇到脏字符,需要不断调试,去掉脏字符,其中\x00
是默认需要去掉的。
参考:
1.https://www.corelan.be/index.php/2009/07/19/exploit-writing-tutorial-part-1-stack-based-overflows/
2.https://www.cnblogs.com/clover-toeic/p/3755401.html
3.https://www.corelan.be/index.php/2011/07/14/mona-py-the-manual/