一道有意思又有点脑洞的re&pwn题目,第一次接触到这种类型的题目,记录一下。
很简单的异或,y1^y2即可得出16字节的input。
1 | Re_1s_So0_funny! |
虽然觉得不可思议,但还是尝试提交了一下,果不其然是错误的,然后查看y1和y2的交叉引用,看看是否出现了反调试,结果也没有。运行程序基本可以确定,这十六字节的输入是没什么问题的,因为输入其他的字符串,程序是立即结束,而输入这十六个字节,有明显的等待时间。
接着就是查看另一个参数为input的函数,
乍一看,没有任何的价值
我也是查看了wp之后才注意到这里的溢出问题。
strcpy不会检测字符串的长度,因此可能发生栈溢出。而destination是十二字节,input是16字节,明显存在溢出问题,而后面的input1更是引人怀疑,交叉引用发现,被这个函数所使用
它提示input again,然后再次对输入的字符串进行检测。一眼看出base64,解码之后是a1s0_pWn,关键的问题是如何让上面的sub_4013BA函数执行完之后不返回main函数而是这个sub_40233D。这里要借助的就是strcpy的溢出。
destination的地址被存放在了栈顶
进一步查看,可以找到原本的返回值
前十六个字节是Re_1s_So0_funny!,60FEDC那里就要用sub_40233D的地址来覆盖了,也就是0x0040233D,然后考虑小端存储最后四个字节的内容是3D、23、40,00,最后一个00不用理会,只需要填入对应的字符即可,也就是**=#@**。
所以最终的flag:Re_1s_So0_funny!=#@a1s0_pWn