CTF Python 程序练习(2)

秋名山老司机(Bugku)

python 快速计算
贴代码·

import requests
import re
url = 'http://123.206.87.240:8002/qiumingshan/'
s = requests.session()
q = s.get(url)
match = re.search(r'(\d+[+\-*]+)+\d+',q.text).group()
b=eval(match)
payload={'value':b}
result=s.post(url,data=payload)
print (result.text)

直接print(q.text)

<head>
<title>下面的表达式的值是秋名山的车速</title>
<meta charset="UTF-8">
</head>
<p>亲请在2så†
计算老司机的车速是多少</p>
<div>136827712+596201102-1362033947+389020038*1805510386+1673464924-1803233829*1633153167-1902107380-1861605492*241002176=?;</div>
<style>
div,p{
text-align: center;
margin: 0 auto;
}
</style>

之后再匹配 \d 代表字符串 + [±/]代表加减乘除 + \d
group()为打印出此表达式给match,用正则表达式,\d+表示一个或者多个数字,[]里为任意一个字符,这里为匹配±
,-需要转义,将这两项括号括起来+,这样才可以匹配多个这样类型的表达式,最后加上一个\d+。

    import re
    a = "123qqq456"
    print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)   #123qqq456,返回整体
    print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)   #123
    print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)   #qqq
    print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)   #456

1. 正则表达式中的三组括号把匹配结果分成三组
group() 同group(0)就是匹配正则表达式整体结果
group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3)
2. 列出第三个括号匹配部分。
没有匹配成功的,re.search()返回None

^:行开头
\d:数字
+:出现至少1次
.:任意字符,除换行和回车之外
?:出现0或1次
(.\d+)?:括号里内出现0或1次
$:行结尾
就是说字符串是数字,并且有可能是小数,因为(.\d)?表示可能带小数
也就是说例如 28 或者28.36都是这个正则能匹配的

eval(match)

eval(expression, globals=None, locals=None) — 官方文档中的解释是,将字符串str当成有效的表达式来求值并返回计算结果

可能输出没有结果,需要多运行几次

猜你喜欢

转载自blog.csdn.net/qq_41306131/article/details/88981644
ctf