2020网鼎杯朱雀组逆向2 tree
本帖最后由 L15263458908 于 2020-5-22 09:41 编辑打开程序找到main函数
进入到chkflag函数,发现其是将输入的flag中的xxx每一个x都换成2进制的形式,每一个4位,然后存在glockflag中
parse函数是将glockflag中的二进制拿出来,0代表左,1代表右,开始遍历叶子节点,如果找到的叶子节点是zvzjyvosgnzkbjjjypjbjdvmsjjyvsjx,就正确
我们先将 每个节点及其路径打印出来
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()
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
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:
flag01 += j
print(flag01)
for i in range(0, len(flag01), 4):
tmp = "%x" % int(flag01, 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
本帖最后由 wgf4242 于 2020-5-26 19:44 编辑
```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()
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
``` wgf4242 发表于 2020-5-26 22:07
这样么。。还是那个错误。
我用的是IDA 7.5,Dword函数和Byte函数变了,根节点的存储的内存地址不是406040,你可以通过动态调试找到root存储的内存地址应该是楼主的0x00406530
动态调试的时候运行Python,Shift+F2运行,应该就可以了
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()
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) 回复一下
感谢楼主热心肠分享{:301_986:}{:301_986:} 迷宫题么,我咋感觉页面上的python代码出现乱码了 {:1_923:}我看不懂代码,然后拿了0分,羡慕大佬。 techliu 发表于 2020-5-18 12:28
迷宫题么,我咋感觉页面上的python代码出现乱码了
不是迷宫,二叉树寻路 不会python 想解题难。 本帖最后由 MAXtoDEATH 于 2020-5-19 09:56 编辑
请问一下楼主为什么那个dfs遍历的时候用Dword==0来判断,我想的是用Byte!=0来判断,谢谢
还有那个dword函数是哪个依赖的,能透露一下吗,谢谢表哥了 MAXtoDEATH 发表于 2020-5-19 09:54
请问一下楼主为什么那个dfs遍历的时候用Dword==0来判断,我想的是用Byte!=0来判断,谢谢
还有那个dword函 ...
那是一个地址,是4个字节,不是1个字节 L15263458908 发表于 2020-5-19 09:56
那是一个地址,是4个字节,不是1个字节
是啊,但是我看题目里的遍历逻辑不是取到这个节点的内容是0-f就返回,取不到就把这个节点+12/16继续遍历吗
这样的话要判断是一个字节的内容还是四个字节的地址不应该就判断这个内容是00还是'0'-'f'吗