首页
社区
课程
招聘
[原创]自动化解KCTF2021第二题南冥神功
发表于: 2021-5-13 23:45 4985

[原创]自动化解KCTF2021第二题南冥神功

2021-5-13 23:45
4985

switch case结构的优化

switch 1,2,3,4,5会转化为switch 0,1,2,3,4,然后通过一个jmp table 实现 switch,table [0,1,2,3,4]

ida调试的时候发现不对劲要去查看汇编代码,否则这些优化会让c伪代码调试看起来很奇怪

在复原代码的过程中,我发现他很像一个迷宫,通过我们的输入走迷宫,迷宫不是简单的上下左右,有6种情况,我也不去分析这六种情况到底是什么样了,我打算写个脚本自动走这个迷宫

思路是使用递归,是每一步都尝试,如果这一步不合法,那就终止此尝试,如果合法,就在这一步的基础上再次尝试

脚本编写的过程中要注意exp函数的参数问题,传入的参数要是副本才行,不同的尝试之间不能互相影响,我在编写脚本的时候就犯了这个错误,浪费了一些时间

最后得到了迷宫的走法,但是题目还有一些限制

本来我想逆向还原了,后来6取余又减法的把我绕晕了,最后选择了爆破

验证一下,正确

说下感受吧,逆向是一个缓慢的过程,一步一步发现程序的奥秘,期间会踩很多坑(有一些坑是自己的失误造成的),慢慢调试不能急就是了

 
 
 
map2 = 0x53, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
  0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
  0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
  0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
  0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
  0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01,
  0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01,
  0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
  0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00]
 
# for i in range(9):
#     print()
#     for j in range(10):
#         if map2[10*i+j] == 1:
#             print("x",end ="")
#         elif map2[10*i+j] == 0x53:
#             print("S",end ="")
#         elif map2[10*i+j] == 0:
#             print("o",end ="")
try_time = 0
def exp(v9_in,v21_in,list2_in,map2):
 
    global try_time
    for i in range(0,6):
        list2 = list2_in.copy()
        v9 = v9_in
        v21 = v21_in
        map1 = map2.copy()
        v10 = i
        is_ok = 0
        if v10 == 0:
            v9 += (v21 & 1 == 0)
            v21 -= 1
        if v10 == 5:
            v9 -= (v21 & 1 != 0)
            v21 -= 1
        if v10 == 3:
            v9 -= (v21 & 1 != 0)
            v21 += 1
        if v10 == 2:
            v9 += (v21 & 1 == 0)
            v21 += 1
        if v10 == 1:
            v9 += 1
        if v10 == 4:
            v9 -= 1
 
        if v21 > 8 or v9 > 9 or 10 * v21 + v9 < 0 or v21 < 0 or v9 < 0:
            is_ok = 0
        else:
            if map1[10 * v21 + v9] == 0:
                map1[10 * v21 + v9] = 1
                is_ok = 1
        #  如果这一步合法,就可以递归,否则结束
        if is_ok == 0:
            if len(list2)==46:
                print(list2)
        else:
            list2.append(i)
            exp(v9,v21,list2,map1)
        try_time += 1
map1 = map2.copy()
exp(0,0,[],map1)
print(try_time)
map2 = 0x53, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
  0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
  0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
  0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
  0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
  0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01,
  0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01,
  0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
  0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00]
 
# for i in range(9):
#     print()
#     for j in range(10):
#         if map2[10*i+j] == 1:
#             print("x",end ="")
#         elif map2[10*i+j] == 0x53:
#             print("S",end ="")
#         elif map2[10*i+j] == 0:
#             print("o",end ="")
try_time = 0
def exp(v9_in,v21_in,list2_in,map2):
 
    global try_time
    for i in range(0,6):
        list2 = list2_in.copy()
        v9 = v9_in
        v21 = v21_in
        map1 = map2.copy()
        v10 = i
        is_ok = 0
        if v10 == 0:
            v9 += (v21 & 1 == 0)
            v21 -= 1
        if v10 == 5:
            v9 -= (v21 & 1 != 0)
            v21 -= 1
        if v10 == 3:
            v9 -= (v21 & 1 != 0)
            v21 += 1
        if v10 == 2:
            v9 += (v21 & 1 == 0)
            v21 += 1
        if v10 == 1:
            v9 += 1
        if v10 == 4:

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//