这最初只是练习一些 Python 编程的简单练习,但我一直无法修复我的逻辑缺陷!
目标很简单。给定一个预定大小的数组,我需要构建该数组大小的所有可能的二进制排列。另一个复杂之处是特定的数组索引已经设置,从而避免了生成多个排列的需要。
举个具体例子:
n=3
arr = [None]*n
arr[0] = 0
二进制排列的结果列表应该是:
[0, 0, 0],[0, 0, 1],[0, 1, 0],[0, 1, 1]
我的代码正在返回:
[0, 0, 0],[0, 0, 1],[0, 1, 1]
所以我可以清楚地看到在哪一点它没有创建进一步的排列(因为这个问题只会随着更大的数组大小而加剧)。不幸的是,我不明白为什么它没有生成最后一个排列。
这是我用来生成和打印二进制字符串的代码:
def arrayPrint(arr, n):
for i in range(0, n):
print(arr[i], end=" ")
print()
def binaryStringGen(n, arr, i):
if i == n:
arrayPrint(arr, n)
return
if (arr[i] == None):
arr[i] = 0
binaryStringGen(n, arr, i + 1)
arr[i] = 1
binaryStringGen(n, arr, i + 1)
else:
binaryStringGen(n, arr, i + 1)
任何有助于理解这一点的帮助将不胜感激!
- LDAP:
pre: mkdir -p <%= @settings["rootDir"] %>/loot/ldap-domaindump <%= @settings["rootDir"] %>/scans/ldap
panes:
- ldapdomaindump:
- tmux select-pane -T 'ldapdomaindump' -t "authd:LDAP.0"
- mkdir -p <%= @settings["rootDir"] %>/loot/ldap-domaindump && cd <%= @settings["rootDir"] %>/loot/ldap-domaindump
- ldapdomaindump -u '<%= @settings["domain"] %>\<%= @settings["user"] %>' -p '<%= @settings["pass"] %>' $(cat <%= @settings["rootDir"] %>/dcIP.txt | head -n 1)
- getADusers:
- tmux select-pane -T 'getADusers' -t "authd:LDAP.1"
- GetADUsers.py -all '<%= @settings["domain"] %>/<%= @settings["user"] %>:<%= @settings["pass"] %>' -dc-ip $(cat <%= @settings["rootDir"] %>/dcIP.txt | head -n 1) | tee <%= @settings["rootDir"] %>/scans/ldap/getADUsers.txt
- ldap signing:
- tmux select-pane -T 'ldap signing' -t "authd:LDAP.2"
- cd <%= @settings["toolDir"] %>/LdapRelayScan || git clone https://github.com/zyn3rgy/LdapRelayScan.git <%= @settings["toolDir"] %>/LdapRelayScan && cd <%= @settings["toolDir"] %>/LdapRelayScan && echo "git+https://github.com/wbond/oscrypto.git@d5f3437" >> requirements.txt; pipenv run pip install -r requirements.txt --force-reinstall && mkdir -p <%= @settings["rootDir"] %>/scans/ldap && cd <%= @settings["toolDir"] %>/LdapRelayScan && pipenv install --skip-lock && cd <%= @settings["toolDir"] %>/LdapRelayScan; clear
- pipenv run python3 LdapRelayScan.py -method BOTH -dc-ip $(cat <%= @settings["rootDir"] %>/dcIP.txt | head -n 1) -u '<%= @settings["user"] %>' -p '<%= @settings["pass"] %>' | tee <%= @settings["rootDir"] %>/scans/ldap/ldapSigning.txt
- get user descriptions:
- tmux select-pane -T 'get user descriptions' -t "authd:LDAP.3"
- crackmapexec ldap <%= @settings["rootDir"] %>/dcIP.txt -u '<%= @settings["user"] %>' -p '<%= @settings["pass"] %>' -d <%= @settings["domain"] %> -M get-desc-users | tee <%= @settings["rootDir"] %>/scans/ldap/userDescriptions.txt
您必须在 else 分支之前添加
arr[i] = None
:
if (arr[i] == None):
arr[i] = 0
binaryStringGen(n, arr, i + 1)
arr[i] = 1
binaryStringGen(n, arr, i + 1)
arr[i] = None # <= add this
否则,当你从
binaryStringGen
回溯并稍后使用相同的 binaryStringGen
值再次调用 i
时,arr[i]
仍将被设置为 1,并且你的代码将进入 else 分支。
更一般地,当您编写对参数有副作用的递归函数时,请确保在函数终止后正确设置这些函数。