课程链接:https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source=7b06bd7a9dd90c45c5c9c44d12e7b4e6
课程附件: https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6
.got.plt中存放的是代码的地址
nop滑梯,什么都不做执行下一个指令
一路nop到shellcode,只要指向nop区域即可;使得地址随机化变得低效
即使程序中没有call system指令,同时也不知道system libc的真实地址;但是我们一定会有system@plt,只要这个程序在任何地方引用过system这个函数
虽然secure函数中system(“shell?!”)没有任何用处,但是system()被放在了plt;如果连这一项都没有就需要在攻击之前泄露大量的信息,把真实地址泄露出来
还需要加上溢出ebp的四个字节,所以这里又是112
这里的padding 就是112个垃圾数据
可以简化成这个形式,都不需要exit了,不需要老老实实退出程序
逆向题入门也可以这样做
找不到/bin/sh
考虑写入进bss
值得注意的是这里调用了gets函数做了两次交互,而不是像之前的题目只发过去payload完事,最后一次交互需要输入/bin/sh
elf.symbols是程序编译链接时的粘合剂,每一个函数名和变量名都指代了自己存在的位置,在编译时对应名称的符号写入对应的内容
buf2属于变量名也是一个符号
这里老师是直接再输入了一次,我是在交互时输入
先把四行字符串放在stdout缓冲区中,使用fflush将缓冲区清空再一口气把这些字符串输出在屏幕上
考虑到实际题目的代码量,这里可以按n修改这个这个变量的名称
找栈溢出的技巧:在每一个能输入的地方输入超长的数据,一旦崩溃就可能存在栈溢出漏洞
这里随机输入一个地址程序崩溃,但是这并不是栈溢出的崩溃,这里是地址无效导致的,所以需要找一个有效地址
在继续输入超长数据时出问题了
main函数中用于保存局部变量的区域
首先调用子函数为其创建栈帧,将相关信息压栈
dest的空间是0x38,src的大小的0x100,将其通过strcpy(dest, src);覆盖会导致导致栈溢出
显然无法完成ret2systemcall
接下来就是ret2libc
plt是代码的填写者,got是代码的保存者
其中f7开头都是libc中的地址,80开头的都是elf本身的地址
这些f7开头的地址表示这些函数被调用过了,在libc中的地址已被填写,由此我们可以泄露这里面的地址以获取libc中的地址;这里我们选取puts,因为其地址位置高,所以我们在read的时候直接把puts对应的gots表中的起始地址传入
值得注意的是我们还有libc的拷贝,只要我们知道偏移量和其中一个值,system的值就可以推导出来
本地还是没打通