前言
什么时候才能乱杀比赛的题啊,给了两个文件第一个是师傅使用ida反编译的数据库文件,有提示但不多,主要还是看程序吧
分析
程序从文件读取输入值,虽然结果和输入无关但是要用到输入时产生的一些触发条件,所以动态强行输出flag不行
一些准备工作,主要读取三个函数地址和获取文件内容和长度
在for循环运行这三个函数,且要让v11变为0,但是我们发现三个函数的功能分别是交换,和两个运算,且第三个运算一定会是整数,所以需要将第二个函数移到第三个函数位置执行,可以使用第一个函数来做到,有点像pwn的shellcode了,利用数组溢出漏洞
构建读取文件
第一步交换函数位置,所以需要找到v12,v13相对v8的索引
可以发现两个函数的相对索引为7和8,在读取文件中v12,v13位于36和40的位置
第二部让第三次计算结果为0,也就是|a1[i] +a1[i+1]| -|a1[i+1]| -|a1[i]| +2为零,此时传入参数为v8,2,3,对应a1[i]为2,a1[i+1]为3,不为零,所以让a1[i+1]变为-1,即v11为-1,对应二进制ffff ffff
使用010editor创建二进制文件进行写入
其它字节可以随意赋值,只是0比较好看
flag: 8cda1bdb68a72a392a3968a71bdb8cda