第一次接触这种题记录一下,一道NSSCTF上的题,当时没做出来,拿来复现一下
本题考查:
sha256爆破、pwntools
打开环境,点进网址,出现下图
看到个sha256与XXXX之间的联系,需要求出XXXX字符,之间sha256爆破即可
import string
import hashlib
s = 'feba8fc64a8d48a17196e888f00d6d7d6f4d905d570d10132d21d7e86e8e3786'
chars = string.ascii_letters + string.digits # 构造字符集
print (chars)
for i in chars:
for j in chars:
for k in chars:
for n in chars:
psw = i + j + k + n + '2OC7RirUwzlRrPuq'
sha256 = hashlib.sha256(psw.encode(encoding='utf-8')).hexdigest()
if s ==sha256:
print(psw[:4])
用上面的代码爆破
看着没什么思路了,想着用pwn的nc进行连接(这里我使用kali进行连接)
这里我因为是先爆破在用nc连接的,所xxxx的值不同,还需要连接后进行爆破(这一步可以省略,但是要先用nc连接后才进行爆破)
很显然出来了题目描述所说的数学题,但是要做100道才能得到flag,这里就需要使用pwntools与服务器进行交互,通过脚本运行计算,那么就得学习一下pwntools 。
学习完后,写代码(我没学太明白),就搜了一个脚本套了一下,只需改下地址和端口即可
from pwn import *
import string
from hashlib import sha256
def get_proof(last, shav):
s = string.ascii_letters + string.digits
for v1 in s:
for v2 in s:
for v3 in s:
for v4 in s:
t = (v1 + v2 + v3 + v4).encode() + last
if sha256(t).hexdigest() == shav:
return (v1 + v2 + v3 + v4).encode()
context.log_level = 'debug'
p = remote('43.143.7.97', 28623) #环境地址,端口
# 爆破sha256
p.recvuntil(b'sha256(XXXX+') #接收数据直到sha256(XXXX+出现
str1 = p.recvuntil(b')',drop=True) #从’sha256(XXXX+‘开始到’)‘出现
print(str1)
p.recvuntil(b'== ')
str2 = p.recvuntil(b'\n',drop=True)
print(str2)
found = get_proof(str1, str2.decode())
print(found)
p.sendlineafter(b'Plz Tell Me XXXX :', found) #p.sendlineafter(some_string, payload) 接收到 some_string 后, 发送你的 payload,加个换行
for i in range(100):
p.recvline(keepends=True)
p.recvuntil(b' ',drop=True) #p.recvuntil(some_string) 接收到 some_string 为止
s=p.recvuntil(b'= ',drop=True)
#p.recvall()
print(s)
res=str(eval(s)).encode()
p.sendlineafter(b"?", res)
p.recvline() #p.recvline() 接收一行输出
p.recvall()
运行后即可得到flag