protostar_stack4

这一次的练习是上一次的延续:
 
上一次是在main中显式的调用了一个函数指针指的函数,我们覆盖了那个函数指针,于是得到了相应的结果,这次有所不同,这次没有显示的调用,只能覆盖main函数的返回地址。
函数调用的时候(x86体系结构),过程是先是从右向左压入参数,然后压入返回地址;进入被调用者的代码部分,压入ebp,把esp赋给ebp,esp减去某个值(这段空间来放局部变量)。
 
这是win和main的反汇编:
 
 
win的地址是0x080483f4
main中esp给局部变量留下的空间是 0x50 = 80
main的地址是0x08048408
 
main函数是在这里被调用的:
 
其中有一句:push $0x80408408
                     call __libc_start_main
main函数的地址作为参数被传入 __lib_start_main函数中,用gdb试一试:
在main设置断点,查看ebp以上的内存:
 
 
那么,理论上,0xbffffda8是上一个的ebp的值,0xb7eadc76是返回地址:
我们在main函数的最后一个语句ret处设置断点:
 
查看esp以上的内容,理论上,esp以上第一个位置就是返回地址,貌似真是这个0xb7eadc76~~~~!!!!
 
我们来试一下,把这个0xb7eadc76换成0x080483f4:
 
果然,成功的输出了那句话,为什么是76呢,因为在main函数中以esp为标准:
ebp:esp+88
buffer:esp+16
ebp上面4个字节是原先的ebp    起始于 esp + 88
ebp再上面4个字节是返回地址    起始于 esp + 92
所以,buffer 到 返回地址的距离是 76!
当然,从72到76这4个字节应该是原先的ebp,如果这个被覆盖了,会产生段错误~~~
如果我们不改这个ebp值,也就是用他本身的值覆盖自己:
 
还有这个段错误,问题在于函数调用的时候总要有相应的压栈和弹栈的操作,这样“生硬”的调用一个函数,还没有想好怎么去掉这个段错误
 
 





posted @ 2013-07-10 10:30  二哥拉手网  阅读(285)  评论(0编辑  收藏  举报