文章目录
- [WEEK3]ststst
- [WEEK3]easyre
[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}