UltraDebug

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: A C D R G Y M Z X S P
公益项目,接受捐赠
查看: 1172|回复: 0
收起左侧

[CTF] PWN学习总结

[复制链接]
11544wwwq

主题

0

回帖

UD

新手上路

UID
17
积分
26
注册时间
2022-2-9
最后登录
1970-1-1
2022-7-17 15:29:05 | 显示全部楼层 |阅读模式

一、栈溢出原理

什么是栈溢出?栈溢出就是缓冲区溢出的一种。 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。缓冲区长度一般与用户自己定义的缓冲变量的类型有关。(PS:摘自百度百科)

简单来说,就是程序没有检查用户输入的数据长度,导致攻击者覆盖栈上不是程序希望写入的地方,比如说返回地址。(PS:本人是这么理解的,如有问题,还请斧正)

在x86中,对于调用一个函数,栈的变化如下:首先,将被调用的函数的参数从右到左依次压入栈中,然后将被调用的函数的返回地址压入栈中,然后跳转到被调用函数的地址去,在被调用的函数中,首先将ebp(这时的ebp是调用者的ebp)压入栈中,最后,将此时的栈顶esp赋值给ebp寄存器(此时的ebp便是被调用函数的栈底了)

以一个实际程序为例,源码如下所示:
PWN学习总结 - 11544wwwq_UltraDebug

对于进入test函数后,栈的变化情况如下图所示:
PWN学习总结 - 11544wwwq_UltraDebug

接着利用gdb调试验证栈的情况如上图所示,首先在test函数处打下断点,然后start命令将程序运行到main函数开头处,查看一下此时的ebp寄存器的值和call test指令后下一条指令的地址,这里可以看到此时ebp寄存器的值为0xffffd1d8call test指令后的下一条指令地址为0x565561f2,如下图所示:
PWN学习总结 - 11544wwwq_UltraDebug

PWN学习总结 - 11544wwwq_UltraDebug

PWN学习总结 - 11544wwwq_UltraDebug

然后运行r命令,进入test函数内部,使用x命令查看此时的栈情况,可以发现栈的情况如上图示意图一样,如下图所示:
PWN学习总结 - 11544wwwq_UltraDebug

PWN学习总结 - 11544wwwq_UltraDebug

test函数内部,有个ver字符数组,在上面的源码中,我们对其进行了手动赋值,假如该数组通过strcpy等函数完成赋值,并且赋值的字符串由用户输入,那么在用户输入的字符串超过12个字节大小之后,ver数组就会接着往高地址增长,在这其中,可以覆盖掉tes

还有更多的精彩内容,作者设置为付费后可见
UltraDebug免责声明
✅以上内容均来自网友转发或原创,如存在侵权请发送到站方邮件9003554@qq.com处理。
✅The above content is forwarded or original by netizens. If there is infringement, please send the email to the destination 9003554@qq.com handle.
回复 打印

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|站点地图|UltraDebug ( 滇ICP备2022002049号-2 滇公网安备 53032102000034号)

GMT+8, 2025-6-18 20:28 , Processed in 0.075032 second(s), 12 queries , Redis On.

Powered by Discuz X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表