00:00
大家好,今天我来分享一下从函数调用到占一出攻击这个知识点。首先呢,我们通过一个C语言编写的小程序来看一下函数调用过程中究竟发生了什么,这个小程序的功能比较简单,就是接受输入,然后输入出来。那我们看一下效果哈。那可以看到就是接收我们的输入,然后输出最后结束就行了。我们用only debug调试一下看看。来到OD的界面以后,右键中文搜索引擎自动搜索,然后我们找一下这个程序。他。大致的位置对吧,定位一下。这里可以看到就是调用product gas之类的,跟我们这边正好可以对得上,然后我们在这里下一个断点,让它运行起来,它就会断在我们下的这个断点的位置,那接下来就要调用print f这个函数了,可以看到在调用之前,它首先会把。
01:17
它需要的参数,也就是请输入字符串冒号这些字啊,给压到占中F8单步看一下已经压到占中,然后。就要去调用print f这个函数了,那在调用之前我们先截个图,保存一下这个。代码可以看到在调用结束之后。它应该返回到的位置是401032这个位置。以及我们看一下目前的计算器的值。然后我们F7单步步入。可以看到在这个位置,它调用PF的同时,会把它的返回地址给压入站中。然后。
02:07
Push EP保存一下之前的栈的栈底指针放到站中。然后把。这个地方作为新的站的站题。然后。在sub ESP开辟一段新的占空间。也就是在。我们这个图示上可以看出是这样增长的,对吧,那不管它中间执行了什么东西。我们看到当最后要返回的时候。ESP与EBP的值。EEP已经还原回去了,然后ESP还差着四,当返回的时候,ESP会自动加四。也就是 eff24正好对应在这个地方。
03:01
接下来去调用gets,我们F8单步执行一下。输入一些字符串,那接下来它断在这个位置。可以看到我们输入的字符串在这里。啊,F9不好意思。重新执行一下。断下来之后,我们继续走。这里是print f,也就是输出我们刚才输入的。可以看到输出了,然后这里是暂停。也就是这里我们回撤继续走,这样就结束了,但是有一个问题。
04:00
大家想一下,我们这个buff它只有十。而盖却没有对输入的长度做相应的限制。所以。如果我们把返回地址也给覆盖了,怎么办呢?继续打开看一下。嗯,断点还激活着我们运行F8。在盖子的时候,我不输入一个正常的,我反而是输入123456789012345678901234567890,我多输一下,这输了有30个数字,然后回撤。大家看一下,此时EBP。已经被覆盖了,我们找一下对应的位置FF80,也就是这个位置。此时EP下面就是返回地址,所以说我们现在返回地址已经被覆盖成了它了,我们标记一下。
05:05
那接下来我们继续F8单步往下走。你到暂停回车一下,那继续,然后走到你看的时候看一下。我们返回地址已经被我们通过战役初给修改掉了。那。再继续F8,此时它会给我们提示一个错误,不知如何单步,因为内存地址30393837不可读,产生如何如那这就是。缓冲区溢出造成的问题,好,接下来我们通过一个例子来看一下,在这个程序里面。它写入了一个shell。函数shell函数的功能就是去拿到开启一个shell。好,我们。
06:00
看一下,如果是正常的话。你随便输一些回撤,它会给你一个hello word对吧,那接下来我们生成一些有规律的字符串,借助的是这个工具啊。然后我们用GDB调试一下。输入之后,因为我们输的太多了,他只有128嘛,然后我们看一下它问题出在哪里。通过CCRC-L然后把你的那个地址给他写上去,它就会告诉你你的程序输入距离返回地址那一块的长度是多少,也就是说只要你超过了140。那你再去写就覆盖到返回地址了。所以我们只需要。随便填充140个字符,然后再把shell这个地址给写上,那我们就可以成功的通过缓冲区溢出攻击拿到一个权限就是啊,当然我们首先得知道shell的地址嘛,对吧?通过一个方法o BG Du-D。
07:18
可以看一下。校函数的地址是8048490,那这个我已经提前写好了,2048490,那通过P兔子这个脚本我们来看一下,首先它会打开这个程序,然后输入的内容呢,是140个A加上8048490这个地址。输入之后,我们开启一个交互,我们看一下。可以看到,此时我们就已经通过战役出攻击执行到了这一个函数。拿,并且这样就算是拿到一个权限了。
我来说两句