2022年春秋杯godeep
题目下载:godeep
分析

看到主函数没有发现什么特别的东西,于是决定动态调试分析

随便输入一个123123
进入第一个goddeeptree的时候可以发现

他需要判断一个v4才能进入下一个文件,看看v4里面是什么

发现是一堆二进制的数据

欸,发现正好是123123,那么逻辑就是很明显了,就是把我们输入的东西变成二进制,然后通过二进制里面的01来判断进入if里面的上面的函数还是下面的函数
最终可以走到输出right的函数。
那么我们直接从right函数一步步回推交叉引用就可以得到最终的二进制密文了
题解

主函数里发现了一个hint,告诉我们如果我们成功了就会输出一个right
我们直接搜索right

发现这个就是输出right的函数
我们交叉引用这个函数

这就是最后一个判断函数了
看到函数窗口发现有几千个函数,一个个来会死掉去。那么我们需要用到idapython这个插件来利用脚本直接进行交叉引用
我们可以发现引用回来的函数,在上面就是1在下面就是0,那么我们可以发现函数头地址减去引用点的地址如果小于111那么函数就是在上面的,然后我们就通过idapython来进行判断然后输出
我的方案如下:
import idautils
import idautils
import idaapi
def get_function_address(function_name):
# 遍历所有函数
for function in idautils.Functions():
# 获取函数名称
# print(idaapi.get_name(function))
name = idaapi.get_name(function)
if name == function_name:
# 如果名称匹配,则返回函数地址
return function
# 如果没有找到函数,则返回 BADADDR
return idc.BADADDR
def fun(xef):
#print(hex(xef))
func_name = get_func_name(xef)
#print(func_name)
#print(hex(xef))
func_addr = get_function_address(func_name)
#print(hex(func_addr))
#print(0x65aa50 - 0x65A9C0)
#print(xef-func_addr)
if(xef-func_addr<=111):
print('1',end='')
else:
print('0',end='')
refs = CodeRefsTo(func_addr,0)
for ref in refs:
xef= ref
break
if(xef!=0x6D3006):
return fun(xef)
else:
print()
return 0
xef = get_func_name(0x65AAB8)#0x65AAB8是第一个引用的地址
function_addr = get_function_address(xef)

发现输出了我们想要的二进制数据,不过可能是我的脚本太烂了
导致后面输出的都是0
就不知道最后需要取几个了,我们可以全都复制下来然后看看有多少个数字,到最后一个1我这里发现是287个,我们可以发现一个字符是两个字节也就是8个二进制位,那么287%8余7那么我们只需要补一个0 就可以完美输出了
由于我们是从后往前判断的,所以字符需要进行倒置,脚本如下:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#include<stack>
#include<set>
#include<string>
#include<cstring>
#include<list>
#include<stdlib.h>
using namespace std;
typedef int status;
typedef int selemtype;
/*
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
佛祖保佑 永不宕机 永无BUG
*/
char a[]="100001100000110001000110110011000010011010101100001011001110110011000110010001100001110011101100101101001110110000011100100111000001110010110100011001101001110010001100001011001011010001000110111011000110011001100110101101001110110010011100001001100100011011001100000011001100011001100110";
int main ()
{
strrev(a);
cout<<a;
}
二进制转为字符网站:https://coding.tools/cn/binary-to-text

