Week1
Web
[Week1] HTTP
BaseCTF{4248fc3d-a280-4de0-b5e6-6ff0ecaa1fca}
[Week1] 喵喵喵´•ﻌ•`
[Week1] md5绕过欸
[Week1] A Dark Room
[Week1] upload
什么过滤都没有,上传一句话木马即可
[Week1] Aura 酱的礼物
卡在SSRF那里, 我想用challenge来读取http://challenge.basectf.fun:44073/,但是已经被http://jasmineaura.github.io占据了,所以能用SSRF
参考博客:浅析SSRF的各种利用方式 - 先知社区 (aliyun.com)
什么是SSRF
SSRF(服务端请求伪造漏洞) 由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。
一般情况下,SSRF针对的都是一些外网无法访问的内网,所以需要SSRF使目标后端去访问内网,进而达到我们攻击内网的目的。
遇到没掌握的SSRF
漏洞,红温两三个小时才做出来,还是得好好学习啊!
PWN
[Week1] 签个到吧
[Week1] echo
/bin/echo $f*
/bin/echo $(/flag)
Crypto
[Week1] 你会算md5吗
GPT辅助解题法。
import hashlib
flag='BaseCTF{}'
output=[]
for i in flag:
my_md5=hashlib.md5()
my_md5.update(i.encode())
output.append(my_md5.hexdigest())
print("output =",output)
这段代码计算了字符串flag
中每个字符的MD5哈希值,并将这些哈希值存储在一个列表中。具体来说:
flag='BaseCTF{}'
定义了一个包含标志的字符串。- 对于
flag
中的每个字符,计算其MD5哈希值。 - 将每个字符的哈希值以十六进制字符串的形式存入
output
列表。 - 最后,打印
output
列表,显示每个字符的哈希值。
这样,output
将包含flag
中每个字符的MD5哈希值的列表。
MD5是一种不可逆的哈希函数,这意味着它将数据(如字符串)转换为固定长度的哈希值,无法从哈希值反推回原始数据。因此,所谓的“解密”通常是指找到匹配的明文数据,这可以通过查找已知哈希值的映射来完成。
你可以创建一个“解密”脚本,这个脚本可以通过穷举法或使用一个已知的字符集去查找与给定MD5哈希值匹配的字符。这是一个示例脚本,使用穷举法来尝试找到每个字符的原始数据:
import hashlib
# 已知的MD5哈希值列表
md5_hashes = [
'9d5ed678fe57bcca610140957afab571', '0cc175b9c0f1b6a831c399e269772661', '03c7c0ace395d80182db07ae2c30f034',
'e1671797c52e15f763380b45e841ec32', '0d61f8370cad1d412f80b84d143e1257', 'b9ece18c950afbfa6b0fdbfa4ff731d3',
'800618943025315f869e4e1f09471012', 'f95b70fdc3088560732a5ac135644506', '0cc175b9c0f1b6a831c399e269772661',
'a87ff679a2f3e71d9181a67b7542122c', '92eb5ffee6ae2fec3ad71c777531578f', '8fa14cdd754f91cc6554c9e71929cce7',
'a87ff679a2f3e71d9181a67b7542122c', 'eccbc87e4b5ce2fe28308fd9f2a7baf3', '0cc175b9c0f1b6a831c399e269772661',
'e4da3b7fbbce2345d7772b0674a318d5', '336d5ebc5436534e61d16e63ddfca327', 'eccbc87e4b5ce2fe28308fd9f2a7baf3',
'8fa14cdd754f91cc6554c9e71929cce7', '8fa14cdd754f91cc6554c9e71929cce7', '45c48cce2e2d7fbdea1afc51c7c6ad26',
'336d5ebc5436534e61d16e63ddfca327', 'a87ff679a2f3e71d9181a67b7542122c', '8f14e45fceea167a5a36dedd4bea2543',
'1679091c5a880faf6fb5e6087eb1b2dc', 'a87ff679a2f3e71d9181a67b7542122c', '336d5ebc5436534e61d16e63ddfca327',
'92eb5ffee6ae2fec3ad71c777531578f', '8277e0910d750195b448797616e091ad', '0cc175b9c0f1b6a831c399e269772661',
'c81e728d9d4c2f636f067f89cc14862c', '336d5ebc5436534e61d16e63ddfca327', '0cc175b9c0f1b6a831c399e269772661',
'8fa14cdd754f91cc6554c9e71929cce7', 'c9f0f895fb98ab9159f51fd0297e236d', 'e1671797c52e15f763380b45e841ec32',
'e1671797c52e15f763380b45e841ec32', 'a87ff679a2f3e71d9181a67b7542122c', '8277e0910d750195b448797616e091ad',
'92eb5ffee6ae2fec3ad71c777531578f', '45c48cce2e2d7fbdea1afc51c7c6ad26', '0cc175b9c0f1b6a831c399e269772661',
'c9f0f895fb98ab9159f51fd0297e236d', '0cc175b9c0f1b6a831c399e269772661', 'cbb184dd8e05c9709e5dcaedaa0495cf'
]
# 字符集,可以根据实际情况修改
charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-\{\}'
# 生成一个字典来存储字符及其对应的MD5哈希值
hash_to_char = {}
# 生成字符和哈希值的映射
for char in charset:
md5 = hashlib.md5(char.encode()).hexdigest()
hash_to_char[md5] = char
# 尝试找到每个哈希值对应的字符
decoded_chars = []
for hash_value in md5_hashes:
if hash_value in hash_to_char:
decoded_chars.append(hash_to_char[hash_value])
else:
decoded_chars.append('?') # 如果找不到匹配的字符
# 输出找到的字符
print("Decoded characters:", ''.join(decoded_chars))
解释:
**md5_hashes**
** 列表**:包含了要解码的MD5哈希值。**charset**
** 字符集**:可能包含你需要的所有字符,可以根据需要扩展。- 生成哈希值映射:使用字符生成哈希值并将其存储在字典中。
- 查找哈希值:查找每个MD5哈希值对应的字符。
请确保你用实际的MD5哈希值替换脚本中的示例值。这个脚本仅适用于较小的字符集和哈希值。如果字符集较大或包含特殊字符,你可能需要扩展charset
以确保找到所有可能的匹配。
[Week1] helloCrypto
GPT辅助解题法。
from Crypto.Util.number import *
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import random
flag=b'BaseCTF{}'
key=random.randbytes(16)
print(bytes_to_long(key))
my_aes=AES.new(key=key,mode=AES.MODE_ECB)
print(my_aes.encrypt(pad(flag,AES.block_size)))
这段代码涉及到AES加密和密钥生成。下面是对代码的详细解释及解密脚本的编写方法。
代码解释
- 导入必要的库:
pythonfrom Crypto.Util.number import *
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import random
Crypto.Util.number
提供一些与数字相关的工具函数。Crypto.Cipher.AES
提供AES加密算法的实现。Crypto.Util.Padding
提供数据填充功能。random
用于生成随机数。
- 定义
**flag**
:
pythonflag = b'BaseCTF{}'
- 这是待加密的消息。它是一个字节串。
- 生成随机密钥:
pythonkey = random.randbytes(16)
print(bytes_to_long(key))
- 生成一个16字节(128位)的随机密钥。
bytes_to_long(key)
将字节串转换为长整数,并打印出来。
- 创建AES加密对象:
pythonmy_aes = AES.new(key=key, mode=AES.MODE_ECB)
- 创建一个AES加密对象,使用ECB模式(电子密码本模式)。
- 加密数据:
pythonprint(my_aes.encrypt(pad(flag, AES.block_size)))
pad(flag, AES.block_size)
将消息填充到AES块大小的倍数(16字节)。- 使用
my_aes.encrypt
加密填充后的数据,并打印加密结果。
解密脚本
要解密这个数据,我们需要知道密钥和加密的数据。假设我们从输出中获得了密钥和加密数据。以下是解密脚本的步骤:
- 获取密钥和加密数据:
- 假设我们已经知道了密钥和加密数据(可以从实际的代码运行中获得)。
- 解密数据:
- 使用相同的密钥和加密模式来解密数据。
解密脚本
pythonfrom Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
from Crypto.Util.number import long_to_bytes
# 假设从加密代码中获得的密钥和加密数据
key_long = <密钥的长整型值> # 从加密代码的输出中获得
encrypted_data = <加密后的数据> # 从加密代码的输出中获得
# 将长整型密钥转换回字节串
key = long_to_bytes(key_long, 16)
# 创建AES解密对象
my_aes = AES.new(key=key, mode=AES.MODE_ECB)
# 解密数据
decrypted_data = unpad(my_aes.decrypt(encrypted_data), AES.block_size)
# 输出解密后的数据
print("Decrypted data:", decrypted_data.decode())
说明:
- 从加密代码中获取密钥和加密数据:
- 替换
<密钥的长整型值>
和<加密后的数据>
为实际从加密代码输出中得到的值。
- 替换
**long_to_bytes**
:- 将长整型密钥转换回字节串格式以用于解密。
**unpad**
:- 去除解密后的填充部分,恢复原始消息。
示例
假设你从加密代码中获得以下输出:
- 密钥(长整型):
1234567890123456
- 加密数据:
b'\x01\x02\x03\x04...'
可以将这些值替换到解密脚本中,运行后你将得到原始的消息BaseCTF{}
。
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
from Crypto.Util.number import long_to_bytes
# 给定的密钥(长整型值)和加密数据
key_long = 208797759953288399620324890930572736628
encrypted_data = b'U\xcd\xf3\xb1 r\xa1\x8e\x88\x92Sf\x8a`Sk],\xa3(i\xcd\x11\xd0D\x1edd\x16[&\x92@^\xfc\xa9(\xee\xfd\xfb\x07\x7f:\x9b\x88\xfe{\xae'
# 将长整型密钥转换为字节串
key = long_to_bytes(key_long, 16)
# 创建AES解密对象
my_aes = AES.new(key=key, mode=AES.MODE_ECB)
# 解密数据
decrypted_data = unpad(my_aes.decrypt(encrypted_data), AES.block_size)
# 输出解密后的数据
print("Decrypted data:", decrypted_data.decode())
[Week1] 十七倍
GPT辅助解题法
这个代码的目的是加密一个字符串,并用一个 cipher
数组来验证加密后的结果是否正确。加密方法是将每个字符的 ASCII 值乘以 17,然后只保留低 8 位(即取模 256)。要解密,只需要反向操作,即将 cipher
中的每个值除以 17(并且考虑到取模 256 的逆运算)。
以下是解密的 Python 脚本:
def decrypt(cipher):
# 因为 17 在模 256 下是可逆的(其逆元是 15),所以我们使用逆元来解密。
# 计算 17 的逆元 mod 256
def mod_inverse(a, m):
m0, x0, x1 = m, 0, 1
if m == 1:
return 0
while a > 1:
q = a // m
m, a = a % m, m
x0, x1 = x1 - q * x0, x0
if x1 < 0:
x1 += m0
return x1
inv_17 = mod_inverse(17, 256)
flag = [(inv_17 * c) % 256 for c in cipher]
return ''.join(chr(c) for c in flag)
cipher = [
98, 113, 163, 181, 115, 148, 166, 43, 9, 95,
165, 146, 79, 115, 146, 233, 112, 180, 48, 79,
65, 181, 113, 146, 46, 249, 78, 183, 79, 133,
180, 113, 146, 148, 163, 79, 78, 48, 231, 77
]
print(decrypt(cipher))
这段脚本计算了 17 在模 256 下的逆元,然后用它来还原原始的 flag
字符串。运行这个脚本将会输出解密后的标志。
[Week1] ez_rsa
GPT辅助解题法
这个代码片段展示了一个 RSA 加密系统的基本实现,但有一些特别的地方。我们将逐步解析代码,并给出 Python 脚本用于解密。
代码解析
- 导入库:
pythonfrom Crypto.Util.number import *
import gmpy2
这行代码导入了 Crypto.Util.number
库用于处理大整数,以及 gmpy2
用于高效的大数运算(尽管在这个脚本中 gmpy2
没有使用)。
- 定义变量:
pythonm = bytes_to_long(b'BaseCTF{th1s_is_fake_fl4g}')
e = 65537
m
是将字符串 'BaseCTF{th1s_is_fake_fl4g}'
转换为长整型整数。e
是公钥指数,通常在 RSA 加密中使用 65537。
- **生成素数和计算 **
**n**
:
pythonp = getPrime(512)
q = getPrime(512)
n = p * q
生成两个 512 位的素数 p
和 q
,然后计算它们的乘积 n
,这是 RSA 加密中的模数。
- **计算 **
**not_phi**
:
pythonnot_phi = (p + 2) * (q + 2)
计算 not_phi
作为 (p + 2) * (q + 2)
,而不是标准的 phi(n)
(即 (p-1) * (q-1)
)。这是一个故意的异常处理方式,可能用于解密验证或挑战。
- 加密:
pythonc = pow(m, e, n)
使用 RSA 加密公式 c = m^e % n
对消息进行加密。
- 打印结果:
pythonprint(n)
print(not_phi)
print(c)
打印出 n
、not_phi
和加密后的密文 c
。
解密脚本
为了解密,我们需要恢复原始消息。通常,解密过程涉及计算私钥。由于 not_phi
的计算方法不同于标准的 phi(n)
,我们需要推导 p
和 q
来计算私钥。
以下是解密的 Python 脚本:
pythonfrom Crypto.Util.number import inverse, long_to_bytes
import sympy
# 给定的值
n = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790344897976690691139671461342896437428086142262969360560293350630096355947291129943172939923835317907954465556018515239228081131167407674558849860647237317421
not_phi = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790384900615665394180812810697286554008262030049280213663390855887077502992804805794388166197820395507600028816810471093163466639673142482751115353389655533205
c = 37077223015399348092851894372646658604740267343644217689655405286963638119001805842457783136228509659145024536105346167019011411567936952592106648947994192469223516127472421779354488529147931251709280386948262922098480060585438392212246591935850115718989480740299246709231437138646467532794139869741318202945
# 推导 p 和 q
p_q_sum = (not_phi - 2**32 - 2) // 2
p_q_diff = sympy.sqrt(p_q_sum**2 - 4 * n)
p = (p_q_sum + p_q_diff) // 2
q = (p_q_sum - p_q_diff) // 2
# 计算 phi(n)
phi_n = (p - 1) * (q - 1)
# 计算私钥 d
e = 65537
d = inverse(e, phi_n)
# 解密
m = pow(c, d, n)
flag = long_to_bytes(m)
print("Decrypted message:", flag.decode())
说明
- **推导
**p**
和 ****q**
:- 通过
not_phi
计算得到p
和q
的近似值,然后求解出实际的p
和q
。这个步骤需要数学上的一些技巧,具体推导可以使用sympy
库来解决。
- 通过
- **计算
**phi(n)**
和私钥 ****d**
:- 使用标准的
phi(n)
计算方法和inverse
函数计算私钥d
。
- 使用标准的
- 解密:
- 使用 RSA 解密公式
m = c^d % n
,然后将结果转换回原始消息。
- 使用 RSA 解密公式
运行上述 Python 脚本可以解密并打印出原始的消息。
2024-08-17 10:59:02
运行代码报错: Traceback (most recent call last): File “D:\Downlaods_1\BaseCTF\week1\crypto\1.py”, line 20, in d = inverse(e, phi_n) File “D:\ProgrameLanguage\Python310\lib\site-packages\Crypto\Util\number.py”, line 135, in inverse raise ZeroDivisionError(“Modulus cannot be zero”) ZeroDivisionError: Modulus cannot be zero
2024-08-17 10:59:04
报错信息表明 phi_n
为零,导致计算私钥时出现问题。这个问题通常出现在以下几个方面:
- 推导
**p**
和**q**
的步骤:- 我们需要确保
p
和q
的值被正确地推导出来。 - 如果推导过程有误,可能会导致
phi_n
的计算出现问题,从而影响到私钥的计算。
- 我们需要确保
- **错误的 **
**not_phi**
:not_phi
是通过(p + 2) * (q + 2)
计算的,不是标准的phi(n)
。我们需要确保p
和q
被正确地推导出来,否则not_phi
可能不适用。
解决方案
我们需要重新审视如何推导 p
和 q
。通常,推导 p
和 q
可以使用如下方法:
- **从
**not_phi**
解出**p**
和 ****q**
: 这里我们需要找到p
和q
的值使得(p + 2) * (q + 2)
和n
满足条件。 - **重新计算 **
**phi_n**
: 确保计算phi_n
的公式正确无误。
以下是改进的 Python 脚本,使用更安全的推导方法来找到 p
和 q
,然后计算 phi_n
和私钥 d
:
pythonfrom Crypto.Util.number import inverse, long_to_bytes
from sympy import symbols, Eq, solve, sqrt
# 给定的值
n = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790344897976690691139671461342896437428086142262969360560293350630096355947291129943172939923835317907954465556018515239228081131167407674558849860647237317421
not_phi = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790384900615665394180812810697286554008262030049280213663390855887077502992804805794388166197820395507600028816810471093163466639673142482751115353389655533205
c = 37077223015399348092851894372646658604740267343644217689655405286963638119001805842457783136228509659145024536105346167019011411567936952592106648947994192469223516127472421779354488529147931251709280386948262922098480060585438392212246591935850115718989480740299246709231437138646467532794139869741318202945
e = 65537
# 推导 p 和 q
# 设 p 和 q 是需要找到的两个素数
# 由 (p + 2) * (q + 2) = not_phi 和 p * q = n,推导 p 和 q
p, q = symbols('p q', integer=True)
# 定义方程
eq1 = Eq((p + 2) * (q + 2), not_phi)
eq2 = Eq(p * q, n)
# 解方程
solution = solve((eq1, eq2), (p, q))
if not solution:
raise ValueError("无法解出 p 和 q")
# 从解中提取 p 和 q
p = solution[0][0]
q = solution[0][1]
# 计算 phi(n)
phi_n = (p - 1) * (q - 1)
# 计算私钥 d
d = inverse(e, phi_n)
# 解密
m = pow(c, d, n)
flag = long_to_bytes(m)
print("Decrypted message:", flag.decode())
说明
- 解方程:
- 使用符号计算库
sympy
解决两个方程:(p + 2) * (q + 2) = not_phi
和p * q = n
。 - 确保得到正确的
p
和q
。
- 使用符号计算库
- **计算 **
**phi_n**
:- 使用
(p - 1) * (q - 1)
计算phi_n
。
- 使用
- 计算私钥
**d**
并解密:- 使用计算得到的
phi_n
计算d
,然后解密消息。
- 使用计算得到的
请确保在执行脚本之前,安装了 sympy
库,如果未安装,可以使用以下命令进行安装:
bashpip install sympy
希望这能解决你的问题!如果仍然有问题,请提供更多详细信息以帮助进一步调试。
2024-08-17 11:00:26
运行代码还是报错: Traceback (most recent call last): File “D:\Downlaods_1\BaseCTF\week1\crypto\1.py”, line 32, in d = inverse(e, phi_n) File “D:\ProgrameLanguage\Python310\lib\site-packages\Crypto\Util\number.py”, line 139, in inverse return pow(u, -1, v) TypeError: unsupported operand type(s) for ** or pow(): ‘int’, ‘int’, ‘Integer’
2024-08-17 11:00:29
报错信息表明 phi_n
的数据类型可能不兼容 Crypto.Util.number.inverse
函数。Crypto.Util.number.inverse
函数通常需要 int
类型的输入,而 sympy
库的解可能返回了 Integer
类型,这导致了类型不匹配。
我们可以调整代码,确保 phi_n
是 int
类型,并且适用于 inverse
函数。下面是更新后的代码,其中将 phi_n
转换为 int
类型:
pythonfrom Crypto.Util.number import inverse, long_to_bytes
from sympy import symbols, Eq, solve
# 给定的值
n = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790344897976690691139671461342896437428086142262969360560293350630096355947291129943172939923835317907954465556018515239228081131167407674558849860647237317421
not_phi = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790384900615665394180812810697286554008262030049280213663390855887077502992804805794388166197820395507600028816810471093163466639673142482751115353389655533205
c = 37077223015399348092851894372646658604740267343644217689655405286963638119001805842457783136228509659145024536105346167019011411567936952592106648947994192469223516127472421779354488529147931251709280386948262922098480060585438392212246591935850115718989480740299246709231437138646467532794139869741318202945
e = 65537
# 推导 p 和 q
# 设 p 和 q 是需要找到的两个素数
# 由 (p + 2) * (q + 2) = not_phi 和 p * q = n,推导 p 和 q
p, q = symbols('p q', integer=True)
# 定义方程
eq1 = Eq((p + 2) * (q + 2), not_phi)
eq2 = Eq(p * q, n)
# 解方程
solution = solve((eq1, eq2), (p, q))
if not solution:
raise ValueError("无法解出 p 和 q")
# 从解中提取 p 和 q
p = int(solution[0][0])
q = int(solution[0][1])
# 计算 phi(n)
phi_n = (p - 1) * (q - 1)
# 计算私钥 d
d = inverse(e, phi_n)
# 解密
m = pow(c, d, n)
flag = long_to_bytes(m)
print("Decrypted message:", flag.decode())
关键改动:
- 将
**p**
和**q**
转换为**int**
类型:确保p
和q
被转换为int
类型,以便与Crypto.Util.number.inverse
函数兼容。 - 确保
**phi_n**
是**int**
类型:计算phi_n
时也确保其类型为int
,避免不兼容问题。
说明:
- 符号计算:我们使用
sympy
解方程,得到的解可能是sympy
的Integer
类型,通过int()
函数转换为标准的 Pythonint
类型。 - 私钥计算:使用
Crypto.Util.number.inverse
计算私钥d
。
请确保安装了 sympy
和 pycryptodome
(Crypto
的库),可以通过以下命令进行安装:
bashpip install sympy pycryptodome
这样修改后的代码应该能够解决你遇到的错误。如果仍有问题,请提供更多细节。
Misc
[Week1] Base
[Week1] 喵喵太可爱了
[Week1] 签到!DK 盾!
[Week1] 海上遇到了鲨鱼
[Week1] 你也喜欢圣物吗
开局一个图片一张压缩包,压缩包加密了,所以从图片下手
010Editor打开,看文件尾,有一串Base64编码
或者kali
直接用strings
命令显示可打印字符,输入strings sweeeeeet.png
发现了一串Base64编码RE9fWU9VX0tOT1dfRVpfTFNCPw==
解密意思是DO_YOU_KNOW_EZ_LSB?
,那就是提示LSB隐写嘛。
可以用kali
的zsteg
,也可以用stegpy
等等LSB隐写的工具。
我直接zsteg sweeeeeet.png
。
获得key:lud1_lud1
,这个就是压缩包解压密码
解压之后获得一个it is fake.zip
压缩文件,里面有一个flag.txt
。
fake嘛,fake就是伪加密呗,根据伪加密的知识,光标这里就是加密区,把后面第二个14000900
改成14000000
即可
然后就可以解压了,√8的7z
解压还是报需要密码,但是我换成bandzip
来解压就可以了
这里还留个坑,下面的才是正确的flag
再Base64解密即可
[Week1] 正着看还是反着看呢?
根据题意百度Misc 逆序
文章内容有代码
运行脚本获得逆向后的文件
放到kali
用file
命令看看是什么文件,说是JPG
,那就给它加上后缀名,获得一张美女图片
然后binwalk
常规操作即可
[Week1] 根本进不去啊!
首先进行域名解析
然后将信息收集到的IP
都添加到hosts
文件里面,参考:CTF:BugkuCTF-web-域名解析_域名解析bugku题解-CSDN博客
然后就用dig
参考高校网络安全管理运维赛 Writeup - 星盟安全团队 (xmcve.com)
参考:linux网络命令:查询 DNS信息的命令 dig的使用和下载、安装说明_linux dig-CSDN博客
Re
[Week1] You are good at IDA
[Week1] UPX mini
参考博客:
CTF逆向-Upx脱壳攻防世界simple unpack_ctf upx-CSDN博客