SHCTF2023 山河CTF Reverse Week3 --- ststst & easyre WP详解

[WEEK3]ststst

在这里插入图片描述
64 bit 的 ELF 文件

在这里插入图片描述
sub_400763点进去看看

在这里插入图片描述

mprotect ,这个
在这里插入图片描述

这一题是SMC + TEA的考察,我写过一篇关于 SMC学习网鼎杯jocker

可以使用idapython写脚本自动修复,也可以使用动态调试,我个人计较喜欢动态

在这里插入图片描述

linux虚拟机远程调试一下,具体步骤:

  • 把文件复制到linux工作台上,chmod 777 ststst 赋予权限(这里我是操作过的)
    在这里插入图片描述

  • 将 ida目录的linux_server文件复制到工作台上,赋予权限
    在这里插入图片描述

  • ./linux_server64 启动服务,
    在这里插入图片描述

  • 然后在ida上点击 Remote Linux debugger
    在这里插入图片描述
    上面俩个填写linux上的文件路径,第三个是文件夹,然后还有虚拟机的ip地址,可以用ifconfig查看。

在这里插入图片描述
远程连接完,随便输入flag先
然后一直F7单步走,如果中间出现 提示 RIP错误的,点击no就好,

一直走到红色部分,停下
在这里插入图片描述

选中push rbp开始,一直选到最下面的 retn处。用U全部Undefine一下,

在这里插入图片描述

之后再用C改为代码,要用force强制处理,之后就是用p创建函数,再反编译。得到一个简单的TEA加密

在这里插入图片描述

密文和key都有,写个exp逆向一下就好;

#include <stdio.h>
#include <stdint.h>
 
 
void decrypt (uint32_t* v, uint32_t* k) {
    uint32_t v0=v[0], v1=v[1], i;
    uint32_t delta=0x61C88647;
    uint32_t sum = -(delta*32);
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];
    for (i=0; i<32; i++) {
        v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
        v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        sum += delta;
    }
    v[0]=v0; v[1]=v1;
}
 
int main()
{
    uint32_t enflag[] = {3683591529,1087210467,2687755904,4294420036,1762408983,3055663206,887612071,2903549586};
    uint32_t key[4] = {0x1234567, 0x89ABCDEF, 0x0FEDCBA98, 0x76543210};
    for(int i=0;i<8;i+=2)
    {
        uint32_t temp[2];        //定义来解密
        temp[0] = enflag[i];
        temp[1] = enflag[i+1];
        decrypt(temp, key);
        //printf("%X%X",temp[0],temp[1]);
        printf("%c%c%c%c%c%c%c%c",*((char*)&temp[0]+0),*((char*)&temp[0]+1),*((char*)&temp[0]+2),*((char*)&temp[0]+3),*((char*)&temp[1]+0),*((char*)&temp[1]+1),*((char*)&temp[1]+2),*((char*)&temp[1]+3));
    }
    return 0;
}

// 5ef846656801c9b9714388d2ccd98cdd

[WEEK3]easyre

在这里插入图片描述
pyinstaller 的题目。

可以直接上pyinstxtractor反编译一下,然后再用 uncompyle6

在这里插入图片描述

得到一个文件夹。打开,找到main.pyc (有个别不同版本的pyinstxtractor反编译出来的是 main文件,要自己改文件后缀)

把main.pyc 和 struct.pyc 拖入十六进制编辑器 查看一下文件头,发现相同且正常,不用更改

直接用uncompyle6 反编译一下 得到 main.py

在这里插入图片描述

打开main.py

在这里插入图片描述

前面是计算积分的,用脚本解下

import sympy as sp

# 定义符号和已知的积分值
x, xor_key = sp.symbols('x xor_key')
f = x ** 2 + x + 1
integral_value = 12024 / 3

integral_result = sp.integrate(f, (x, 1, xor_key))
equation = sp.Eq(integral_result, integral_value)
solutions = sp.solve(equation, xor_key)
print(solutions)

# [22.3810923951302, -11.9405461975651 - 19.8722996126735*I, -11.9405461975651 + 19.8722996126735*I]

用22,23 带回去验证下,发现xor_key 是 23
在这里插入图片描述

按照原来的思路 写脚本

import base64
import marshal
from dis import dis

encoded_data = b'#`VVVVVVVVVVVVVVVVVVVVVSVVVVFVVVV_YZVVVVMVU|VNFV@pU|V{xUMVYvVzBSMVDSVFRVMFDSV\\VQMV@\x7fVAxPMFU{V@BPp`]vU%B_MF]eVy]VMFY|UxZUVFUbTPBSMVrSVFRVMV\x7fCVT|]N`^VVVVVVVVVVVVVVVpVVVVPVVVVF`VVV_GFVVVVsVU\'V@FUp`PSVO\'TMV].V$FUMVPSVBFVOC".U_`SqV]/UU|VQ`U/V_`RsV]/V^ZUQpVMVUtVMVR@V_\'SqV]/Vo|VqV]/UU|VVpU/Vy`RGVU/Vy`SGVUoPPFTUVU.U_\'SsVXSV_\'QqVQRVQ&pqFM/UPFSQ`U|VENVqFE/V$`TqVFMVUtVMVR@V_\'SqV]/Vo|VqV]/UU|VVpU/Vy`RGVU/Vy`SGVU/Vy`TqVFMV_`TqVZMVUtVMVR@VU|VqFs/UvVRqVM/U\'RVxFRUV_QfqVACVT|RCb|VVFVV!FVVVVSgVFVVVT|Q%pEdvOY\'%pAnN@"yMsxSuPAb%p{~rOE{NO]nNOyvUzQ`tPAbMT|^%pYeMO{vTOUdN@{bsPA#sYxUB.xUvcxUvAx\\N%{`vPAnsPA#sYxRN%\x7f\x7ftcxUv!|Vtp/VVVS!UzM&u~"`rsx[tzZ\'O%AbN$]"t_FUVVVVto`VVVVVVF`UUV^ZVDVU_V^^VFNTTVRZVEVUPpRNVEVTt\x7fRVVVUmT`VVVPA#N@&`uPAqv%A"tnxVVVSN{U!ez%M\'!&&VP ez!UZmA.\'X"g^\'/NUcvXd.TPRTTD!&UB\\`dT.R}Q{!QQUdr~UguyU&sTU"u$An^PMdN@t!rpA&sPNcXQxSr@Am@p]bu\'#gT_^EVVVVtp|VVVUvU@YxM@Ye%pA`tz{bsYxQv@"`sOCvUzAbN%.|MsxRMzo\x7fM&x]M@"}ty{`sPA|tp/VVVUnS`VVV_^GVVVVt\x7fVVVVSvTSocu%E&uPB<VFVVV_ZFVVVVTUFRVFFTTVRZVpxTTVR\\Vp**'


xor_decoded_data = bytes([byte ^ 23 for byte in encoded_data])
decoded_data = base64.b64decode(xor_decoded_data)
code_obj = marshal.loads(decoded_data)
exce(code_obj)

运行会输出

在这里插入图片描述

这里就是卡在这了。

exec 是 Python 中的一个内置函数,用于执行动态生成的 Python 代码。这个函数接受一个代码对象(通常是由字符串形式的代码或者编译后的字节码构建而成),并执行其中的 Python 语句exec 是 Python 中的一个内置函数,用于执行动态生成的 Python 代码。

重点,接受一个代码对象,通常是由字符串形式的代码或者编译后的字节码构建而成。

而且前面marshal.loads(decoded_data) 反序列化从某种格式编码的代码。所以现在的encode其实是类似于字节码的存在?因此我们可以直接用dis模块查看code_obj 中包含的 Python 字节码的信息。

将上面改成:

from dis import dis
dis(code_obj)

再次运行:

在这里插入图片描述
粗略看了就是一个rc4的加密,rc4加密是对称的,因此我们继续将key和check值解密就好。

from Crypto.Cipher import ARC4

key = b'example_key'  # 替换成你的RC4密钥
ciphertext =b'\xd8\x94\x1e\xab\x9bft\xeb]@\x1b\xba\xe6\xe8\x133W\xdd\x0e\xe6\x924\xf1\x80mh\xeb=\x08a\x02\t.\xb5\x05B\xb0\xb0/D\x8cY'

ciphertext_bytes = bytes(ciphertext)
cipher = ARC4.new(key)
plaintext = cipher.decrypt(ciphertext_bytes)

print("Decrypted Data:", plaintext.decode('utf-8'))

# flag{d8e8d9d0-b2b1-7304-74b760-90b11ab6a3}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sciurdae.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值