吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5781|回复: 26
收起左侧

[CTF] 2020网鼎杯朱雀组逆向2 tree

[复制链接]
zsky 发表于 2020-5-18 11:19
本帖最后由 L15263458908 于 2020-5-22 09:41 编辑

打开程序找到main函数
1.png

进入到chkflag函数,发现其是将输入的flag中的xxx每一个x都换成2进制的形式,每一个4位,然后存在glockflag中

2.png

parse函数是将glockflag中的二进制拿出来,0代表左,1代表右,开始遍历叶子节点,如果找到的叶子节点是zvzjyvosgnzkbjjjypjbjdvmsjjyvsjx,就正确

3.png

我们先将 每个节点及其路径打印出来
[Python] 纯文本查看 复制代码
def traverse_leaf(pnode):
    if pnode != 0:
        if Dword(pnode + 12) == 0 and Dword(pnode + 16) == 0:
            print(chr(Byte(pnode)))
            print("".join(a))
            lujing.append([chr(Byte(pnode)), "".join(a)])
        a.append('0')
        traverse_leaf(Dword(pnode + 12))
        a.append('1')
        traverse_leaf(Dword(pnode + 16))
    if pnode != 0X0406530:
        a.pop()


traverse_leaf(0X0406530)
print(lujing)


[['y', '0000'], ['b', '00010'], ['q', '00011'], ['g', '0010'], ['f', '0011'], ['j', '010'], ['w', '01100'], ['p', '01101'], ['x', '011100'], ['d', '0111010'], ['i', '0111011'], ['k', '01111'], ['s', '100'], ['z', '1010'], ['n', '1011'], ['c', '11000'], ['t', '110010'], ['e', '110011'], ['h', '1101'], ['o', '11100'], ['l', '1110100'], ['u', '11101010'], ['r', '111010110'], ['a', '111010111'], ['m', '111011'], ['v', '1111']]

然后在开始写脚本,将 zvzjyvosgnzkbjjjypjbjdvmsjjyvsjx 转成路径,然后拼起来,4位4位的分开就是flag中的xxxx

[Python] 纯文本查看 复制代码
lujing = [['y', '0000'], ['b', '00010'], ['q', '00011'], ['g', '0010'], ['f', '0011'], ['j', '010'], ['w', '01100'], ['p', '01101'], ['x', '011100'], ['d', '0111010'], ['i', '0111011'], ['k', '01111'], ['s', '100'], ['z', '1010'], ['n', '1011'], ['c', '11000'], ['t', '110010'], ['e', '110011'], ['h', '1101'], ['o', '11100'], ['l', '1110100'], ['u', '11101010'], ['r', '111010110'], ['a', '111010111'], ['m', '111011'], ['v', '1111']]
res = "zvzjyvosgnzkbjjjypjbjdvmsjjyvsjx"
flag01 = ""
flagx = ""
for i in res:
    for j in lujing:
        if i in j[0]:
            flag01 += j[1]
print(flag01)
for i in range(0, len(flag01), 4):
    tmp = "%x" % int(flag01[i:i+4], 2)
    flagx += tmp
print(flagx)


最终打印出flagx是afa41fc8574f12481a849d7f7120f89c
将flag{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}替换掉,即
flag为flag{afa41fc8-574f-1248-1a84-9d7f7120f89c}

题目链接
链接:https://pan.baidu.com/s/1RUPL9W2119cJ8TDVf2m-8Q
提取码:sca9

免费评分

参与人数 8威望 +1 吾爱币 +27 热心值 +6 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
chenlian035 + 1 + 1 我很赞同!
hackcat + 1 谢谢@Thanks!
Peppermint + 1 谢谢@Thanks!
wumingpeng + 1 + 1 谢谢@Thanks!
superhechong + 1 + 1 用心讨论,共获提升!
pwp + 1 + 1 膜拜大佬啊
solly + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wgf4242 发表于 2020-5-26 19:31
本帖最后由 wgf4242 于 2020-5-26 19:44 编辑
def traverse_leaf(pnode):
    if pnode != 0:
        if Dword(pnode + 12) == 0 and Dword(pnode + 16) == 0:
            print(chr(Byte(pnode)))
            print("".join(a))
            lujing.append([chr(Byte(pnode)), "".join(a)])
        a.append('0')
        traverse_leaf(Dword(pnode + 12))
        a.append('1')
        traverse_leaf(Dword(pnode + 16))
    if pnode != 0X0406530:
        a.pop()

traverse_leaf(0X0406530)
print(lujing)

a是什么? a=[]?
我这Shift+F2运行不出来。 0406530 是glockflag么?
.bss:00406580                 public _glockflag
我写405630和405680都不出结果。。

Traceback (most recent call last):
  File "<string>", line 15, in <module>
  ...
  File "<string>", line 3, in traverse_leaf
  File "E:\Software\CTF\Reverse_IDA_Pro_v7.0_Portable\python\idc_bc695.py", line 90, in Dword
    def Dword(ea): return get_wide_dword(ea)
  File "E:\Software\CTF\Reverse_IDA_Pro_v7.0_Portable\python\idc.py", line 1837, in get_wide_dword
    return ida_bytes.get_wide_dword(ea)
RuntimeError: maximum recursion depth exceeded
YCheung 发表于 2021-6-21 11:37
wgf4242 发表于 2020-5-26 22:07
这样么。。还是那个错误。

我用的是IDA 7.5,Dword函数和Byte函数变了,根节点的存储的内存地址不是406040,你可以通过动态调试找到root存储的内存地址应该是楼主的0x00406530
动态调试的时候运行Python,Shift+F2运行,应该就可以了
[Python] 纯文本查看 复制代码
a=[]
lujing=[]
def traverse_leaf(pnode):
    if pnode != 0:
        if get_wide_dword(pnode + 12) == 0 and get_wide_dword(pnode + 16) == 0:
            print(chr(get_wide_byte(pnode)))
            print("".join(a))
            lujing.append([chr(get_wide_byte(pnode)), "".join(a)])
        a.append('0')
        traverse_leaf(get_wide_dword(pnode + 12))
        a.append('1')
        traverse_leaf(get_wide_dword(pnode + 16))
    if pnode != 0x00406530:
        a.pop()
 
 
traverse_leaf(0x00406530)
print(lujing)
那你想吧 发表于 2020-5-18 11:26
棕熊哒哒 发表于 2020-5-18 11:54

感谢楼主热心肠分享
techliu 发表于 2020-5-18 12:28
迷宫题么,我咋感觉页面上的python代码出现乱码了
pwp 发表于 2020-5-18 12:35
我看不懂代码,然后拿了0分,羡慕大佬。
 楼主| zsky 发表于 2020-5-18 13:00
techliu 发表于 2020-5-18 12:28
迷宫题么,我咋感觉页面上的python代码出现乱码了

不是迷宫,二叉树寻路
daymissed 发表于 2020-5-18 16:54
不会python 想解题难。
MAXtoDEATH 发表于 2020-5-19 09:54
本帖最后由 MAXtoDEATH 于 2020-5-19 09:56 编辑

请问一下楼主为什么那个dfs遍历的时候用Dword==0来判断,我想的是用Byte!=0来判断,谢谢
还有那个dword函数是哪个依赖的,能透露一下吗,谢谢表哥了
 楼主| zsky 发表于 2020-5-19 09:56
MAXtoDEATH 发表于 2020-5-19 09:54
请问一下楼主为什么那个dfs遍历的时候用Dword==0来判断,我想的是用Byte!=0来判断,谢谢
还有那个dword函 ...

那是一个地址,是4个字节,不是1个字节
MAXtoDEATH 发表于 2020-5-19 10:19
L15263458908 发表于 2020-5-19 09:56
那是一个地址,是4个字节,不是1个字节

是啊,但是我看题目里的遍历逻辑不是取到这个节点的内容是0-f就返回,取不到就把这个节点+12/16继续遍历吗
这样的话要判断是一个字节的内容还是四个字节的地址不应该就判断这个内容是00还是'0'-'f'吗
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 18:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表