• regexpire-攻防世界-MISC


    用nc链接靶机:

    root@kali:~/Desktop# nc 220.249.52.133 37944

    Can you match these regexes?

    B+v*(clementine|sloth)*Q*eO(clinton|alien)*(cat|elephant)(cat|trump)[a-zA-Z]*(dolphin|clementine)\W*(table|apple)*

    大致上是服务端给出一个正则表达式,要求输入符合该表达式的字符串。这里可以使用Python中的rstr库,该库主要用于根据条件生成随机字符串(参见rstr · PyPI),其中的xeger函数可以从正则表达式生成随机字符串。例如:

    import rstr

    print(rstr.xeger(r'B+v*(clementine|sloth)*Q*eO(clinton|alien)*(cat|elephant)(cat|trump)[a-zA-Z]*(dolphin|clementine)\W*(table|apple)*'))

    输出:

    BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvclementineclementineclementineclementineclementineclementineclementineslothslothclementineslothclementineclementineslothslothslothclementineslothslothclementineslothslothclementineclementineslothclementineslothclementineclementineslothclementineslothQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQeOalienclintonalienalienclintonclintonalienalienalienalienalienclintonalienclintonclintonclintonclintonalienalienalienalienalienalienclintonclintonalienclintonalienelephanttrumpGwSPaPqNKdPpccXBlHYxrhwyMjRdzSzSKELLUekKJVYGpdKxQapzainTuYuWclementine|;appletableappletableappletabletabletabletableappletabletabletableappletableappleappletabletabletabletabletableappletableappleappletableappleappletableappleappletableappleappletableappleappletabletableappleappletableappleappleappleappletableappleappleappleappleappletableappletableappletabletableappleappletableappleappletableappleappletableappleappletableappletabletableappleapple

    注意xeger适用于大多数简单的正则表达式,但并不完整支持Python中所有正则表达式功能

    利用Python的pwntool库来自动完成获取正则表达式和提交答案的过程:

    1. from pwn import *
    2. import rstr
    3. from time import sleep
    4. r = remote('220.249.52.133', 37944)
    5. print(bytes.decode(r.recvline()))
    6. i = 1
    7. while True:
    8. question = bytes.decode(r.recvline()[:-1])
    9. if 'Irregular' in question:
    10. break
    11. if 'flag' in question:
    12. print('flag is:', question)
    13. break
    14. print('No.', i, ':\n', question, '\n')
    15. answer = rstr.xeger(question)
    16. while '\n' in answer[:-1]:
    17. answer = rstr.xeger(question)
    18. print(answer, '\n')
    19. r.sendline(answer)
    20. i += 1
    21. sleep(0.2)

    同时有一个需要特别注意的地方。如果提交的答案中包含有换行符\n,服务端会认为这标识了一段答案提交结束,导致所提交的答案只有\n前的半段,无法通过正则表达式判断。因此,若生成的答案字符串中包含\n,需要通过一个循环来判断并重复生成,直到答案中不包含\n为止再提交。

    运行该脚本,回答正确1000次后服务端返回flag。

    flag:flag{^regularly_express_yourself$}

  • 相关阅读:
    List操作的一些常见问题
    2023医药微信公众号排名榜top100汇总合集
    致测试/开发程序员:爱生活,不加班,苦逼的程序员......
    Linux内核调试篇——获取内核函数地址的四种方法(一文解决)
    互联网医院系统|互联网医院软件功能与广阔应用领域
    数据库概述05(数据库查询及修改操作)
    联合概率和条件概率的区别和联系
    1074 Reversing Linked List
    Oracle-AWR快照无法自动生成问题分析
    NEXT.js环境变量使用
  • 原文地址:https://blog.csdn.net/qq_75023818/article/details/136427191