[网鼎杯 2020 青龙组]jocker
1.初步分析 sp恢复平衡 得到假flag
根据这里所谓的提示我们大概就能知道这里的flag就是假的,但是我们来试一下?
v2是我们这里的值 我们可以shift+e或者右键如下
然后在下面进行提取就好了
非常明显的假flag
我们从这里也可以看出来它把str传给了Destination但是并没有利用到Destination所以也没有什么意义,而真正在flag则藏在下面了
点击encrypt发现有错误提示
看到sp栈指针错误
勾选此单选框后
我们回到主函数处,按tab键转换为汇编窗口,往下翻找到call 指令部分,进行修复sp指针偏移值
点击这个我们要修改栈帧的函数 改为0
再把这里改为0
修改后
不再提示说明已经修改完成了
2.开始动态调试 修复encryot() 得到一半flag
而此时我们仍然是进入不了encrypt(显示异常)
如果到最后都不能的话可能出现了加壳?我们进行动态调试看看
此时我们就需要利用前面的假flag进行omg函数的绕过(原来每一步都很有用?或者我们直接爆破哈哈)
flag{fak3_alw35_sp_me!!}
在此处设下断点并且断下来 然后点进去encrypt() 在这里下断点的原因是因为我们可以直接停在这里找
显而易见从这里开始
到这里结束就是我们所加的壳
从定义头一直到endp,还有下方这一块区域,全部选中之后按u(undefined)取消定义,再在定义头按p即可识别为函数
识别结果如图所示,然后F5就能够进行反编译了
提取数据
得到的flag是不完整的???
3.尝试寻求其他信息 利用ollydbg脱壳获取最后一个函数的信息(ida也可以但我实在不会了)
因此我们试着返回字符串寻找有效信息?
非常明显的提示我们点进去看看(发现交叉引用不了。。。)
前面我们打好补丁后finally()就没有了???也许finally()也很奇怪,我们重新打开程序
进入finally()
真的太奇怪了
发现又是这里的问题
将40159A~40159D处的数据全都转为代码,并将函数改为Undefine
重新在40159A处创建函数,得到新函数finally()
此时我的ida实在不会了
用ollydbg进行脱壳
找到函数的入口点
找到这个函数了
4.利用思维 写脚本 出flag
这个函数表示看不懂?但是flag最后一个是‘}’
而v3肯定是代表flag的最后五个符号
所以我们可以利用异或来求最后五个数
写脚本求出最后的flag
#include<iostream> using namespace std; int main() { unsigned int a[19] = { 0x0000000E, 0x0000000D, 0x00000009, 0x00000006, 0x00000013, 0x00000005, 0x00000058, 0x00000056, 0x0000003E, 0x00000006, 0x0000000C, 0x0000003C, 0x0000001F, 0x00000057, 0x00000014, 0x0000006B, 0x00000057, 0x00000059, 0x0000000D }; char b[]={"hahahaha_do_you_find_me?"}; for(int i=0;i<=18;i++) { printf("%c",a[i]^b[i]); }//%tp&: char c[]={'%','t','p','&',':'}; int d=c[4]^'}'; for(int i=0;i<5;i++) { printf("%c",d^c[i]); } }
flag{d07abccf8a410cb37a}