又是overflow_still, 先进ida看看,
可以看到核心代码便是cmp [ebp+arg_0], 0CAFEBABEh
, 如果成功的话则call system
, 最上面有gets
给栈溢出开了漏洞, gdb一把梭
首先在cmp
上打上断点方便计算偏移量
通过pattern_create 200
构造字符串, 然后输入程序, 在断点下停下, 通过x/wx $ebp+0x8
查询到0xffffcc30 0x31414162
由小端储存可转换为字符串bAA1
, 查询偏移量位48
编写代码, 插入正确的0xcafebabe
常规题, 一把梭, 在函数列表里发现可疑函数what_is_this
, 打开发现shell
很明显了, 就是要跳过来
gdb打开, pattern_create 200
构造字符串, 程序崩溃, 查看eip
寄存器
随后调用srand
函数, 参数为 [offset a + 0x0]
, 翻译过来就是srand(a[0])
然后调用rand函数, 下面对两个数进行比较
srand(seed)
, 在相同的seed下出来的随机数序列是相同的, 于是可以通过劫持seed达到操作随机数, 使用gdb进行动态调试.
首先在srand调用前和对比随机数处打上断点
使用pattern_create 200
构造200字符串输入, 此时程序断在srand
处, 可以看到种子为A-AA
程序继续向下走, 到达对比处停下, 查看生成的随机数x/wx $ebp-0xc
, 发现生成的随机数为0x38
, 随后使用pattern_offset A-AA
查询到偏移量为20, 构造脚本
上上下下左右左右BA
maze意思为迷宫, 本题可能和迷宫有关, 查看代码, 发现关键函数move
进入move, 扫一眼逻辑, 发现了熟悉的字母WASD
查看代码, 这里有一个小坑a1和::a1不是同一个变量
逻辑指出当输入为a时::a1 -= 1
, 为s时::a += 8
, 说明整个迷宫的高度为8格
查看return, a[::a1] == 80
, a[]说明为迷宫地图, 而==80则在判断是否走的是正确的路
进入a, 提取出迷宫地图, 为64个, 说明迷宫为8*8
大小
经历15次循环后, 最后一个判断a[::a1] == 87
, 87应该为迷宫终点, 对应为W, 迷宫中也有
编写代码, 解析迷宫
由于::a1无初始值, 说明初始位置为(0, 0), 要到最终位置, 路径为DSSDSSSDDWWDDDS
则结果为flag{DSSDSSSDDWWDDDS}
丢进ida后连main函数都没有, 很明显加壳程序
使用Detect It Easy
查到为UPX3.9.6
壳, 直接使用工具脱壳 upx/tags
然后丢进ida, 发现一堆进行验证, 有check1 check2 check3
然而最终flag(), 我是不是把这题当pwn题来写了
发现函数There
, 里面才是真正的flag计算公式, 直接上Python了
明示cookies, 打开一看, 这不是我熟悉的JWT吗? 我开发也用这个
加密方式从HS256改为none, 魔改body部分guest为admin, permission为true, 重新拼接
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2VyIjoiYWRtaW4iLCJwZXJtaXNzaW9uIjoidHJ1ZSJ9.
发送即可
一个带密码压缩包, 内容
哇这不是熟悉的brainfuck吗, 建议下次使用whitespace, 在线运行下即有
解压后得到一个二维码, 补三个角扫一扫就出来了, 懒得复现了