3.10.3 内存越界引用和缓冲区溢出

目录

P195

gets函数体中有一个语句*dest++:注意回忆一下,这里的++是后自增,所以先会解引用,然后把c的值赋值,然后再将指针加一;如果写成(*dest)++,那么就是先解引用,并且让dest指向的值后自增(而不是像前面一样让dest后自增)

还有一些函数与gets一样image

然后讲下书上那个echo函数,可以看到汇编代码中第三行将%rdi指向栈帧顶,所以接受到的字符将存放在那里,于是不超过23字节(最后一个字节用来填写停止符\0)就问题不大,超过了的话可能会跳转到其他地方也可能RE(为栈帧分配24字节是系统的事,不是说我们给缓存分配了8个字节的大小就只分配8个字节的栈帧);另外注意到call指令是压栈和跳转,也就是说call包含了让栈指针减小,所以代码第三行直接让%rdi指向%rsp是没问题的,接下来的gets不会覆盖echo的返回地址

P197

来看一下什么叫做攻击代码(下图中的P少写了一句话:在调用bar()之前先要调用Q
image
在调用Q的时候,Pcall指令分配栈帧并将下一条指令的地址设为A(图中为B是因为被覆盖了,后面会讲);然后Q分配栈帧,其中深紫色的是类似于书P195的echo的汇编代码的第二行的代码分配出来的,浅紫色的是call指令分配的,存储了Q的返回地址;在执行gets的时候,我们给gets的字符串的组成依次是我们想要执行的代码(也就是攻击代码,exploit code),一些无意义的填充字符串和地址BB是我们的攻击代码的起始位置);在执行gets之后,我们从Q返回的时候,由于原先的A已经被B替代,所以接下来执行的代码就是攻击代码
一个很简单的解决方法就是使用fgets,可以指定读入的字符数
image

posted @ 2025-07-23 17:02  最爱丁珰  阅读(8)  评论(0)    收藏  举报