本人也是在自学过程,主要目的也是记录学习过程,有些地方做的不太好,都是按照自己理解进行讲解的(不专业),欢迎大家指出问题
此处我将文件命名为pwn
checksec pwn 查看一下保护机制

可以看到这是一个32-bit的文件,NX保护开启
将文件拖入ida,按F5将汇编代码转换成c语言代码,得到

可以看到第一次让我们输入s1,如果strcmp(s1, "administrator")不等于0,也就是如果s1不等于administrator,就会结束程序,所以第一次得输入administrator。然后让我们选择,如果选0:结束;如果选1:进入AddLog(让我们输入log);如果选2:进入Display(打印所有的log);如果选3:进入Print(输出Printing……);如果选4:进入GetFlag

看一下AddLog函数,和GetFlag函数


可以看到我们在AddLog里可以让我们128字节的数据,然后这个数据会作为GetFlag函数的参数,然后在GetFlag函数内复制给dest,然而dest距离ebp偏移只有0x48,远小于128,所以可以发生栈溢出。
因此我们只需要在AddLog函数里输入0x48+8的垃圾数据,再拼接我们的ROP链。然后在GetFlag函数里复制给dest,发生栈溢出,覆盖返回地址为我们的system("sh"),获得shell
返回虚拟机
ROPgadget –binary pwn –string "sh"

得到sh_addr = 0x80482ea
nano exp.py

上面已经讲解过了,在这不再重申一遍
保存退出
python3 exp.py
cat flag

此题完




