在终端使用./pwn2时提示运行失败,右键点击pwn2文件设置权限为允许作为程序运行
在命令行中重新运行pwn2,输入指令ls,程序pwn2可以正常运行,成功通过直接修改机器指令实现对程序调用函数的改变
输入完毕后稍等片刻完成GDB安装,再次输入gdb -v显示版本号即为安装成功:
接下来开始测试输入一个较长的字符串用于找出输入的哪些部分可以覆盖返回地址:
首先进入root模式,输入gdb pwn1进入调试模式,输入r开始调试:
输入一串长数字1111111122222222333333334444444412345678,输入完毕后输入info r查看eip寄存器的值:
可以看出此时eip的值为0x34333231,正好对应1234的倒序的ASC码,所以输入数字的第24位至28位可以覆盖返回地址,所以令输入的第24位至28位对应函数getshell的地址即可让程序调用函数getshell
通过反汇编可以看到getshell的地址为0804847d,根据之前eip的值是数字1234的逆序的ASC码可以得出,此时输入11111111222222223333333344444444\x7d\x84\x04\x08即可将getshell的地址覆盖到程序的返回地址中。
3.4 构造输入字符串 因为我们无法直接通过键盘输入\x7d\x84\x04\x08这样的十六进制字符串,所以我们需要将字符串11111111222222223333333344444444\x7d\x84\x04\x08作为一个文件,然后将其作为pwn1的输入即可完成十六进制字符串的录入。首先输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input将字符串存储到文件“input”中:
然后使用命令xxd input以十六进制的形式查看文件input,可以看到成功将十六进制字符串以文件形式存储:
然后将input的输入,通过管道符“|”,作为pwn1的输入。
输入完毕之后程序开始运行,此时输入ls发现成功列出了当前目录下所有文件,说明成功使用输入构造过的过长字符串覆盖返回地址成功使得程序调用函数getshell。