题目难度很友好,也借此拿下第一次ak,值得纪念
编码喵#
魔改的Base64,反编译看main函数比较乱,但是发现了一个重要的函数_text_72()
,跟踪发现了一串特征鲜明的Base64编码表。
之后在主函数也能找到编码后的密文,用cyberchef解密即可。
ezrc4#
签到题,原汁原味的RC4,程序中能找到加密后的密文和key。
唯一需要注意的是key是被xor加密过的,具体算法在函数X_X()
中,把key解密后再对RC4解密。
key0="fenkey?"
key1=[0x0A, 0x0C, 0x1A, 0x08, 0x11, 0x1F, 0x1E]
flag=[]
enc=[0xd5,0xb2,0x7c,0xdc,0x90,0xa2,0x6e,0x60,0x6,0x13,0xe4,0x71,0x59,0xb0,0x90,0x31,0xb2,0xc7,0x1d,0xd7,0x7f]
key = [chr(ord(key0[i])^key1[i]) for i in range(len(key0))]
s_box = list(range(256))
j = 0
for i in range(256):
j = (j + s_box[i] + ord(key[i % len(key)])) % 256
s_box[i], s_box[j] = s_box[j], s_box[i]
i = j = 0
for s in enc:
i = (i + 1) % 256
j = (j + s_box[i]) % 256
s_box[i], s_box[j] = s_box[j], s_box[i]
t = (s_box[i] + s_box[j]) % 256
k = s_box[t]
flag.append(s^k)
print(bytes(flag))
ezpython!!!!!#
python的exe
文件。用pyinstxtractor
先分离出pyc
文件。之后进行反编译。由于python版本问题,本地的uncompyle6
引擎失效,所以找了在线的pycdc
引擎进行反编译。
查看py源码,导入了Litctfbase64
库,然后对程序中的密文字符串进行解码并且作为flag输出。为了分析魔改Base64的具体算法,需要继续查看这个库的源码,位置在pyinstxtractor
文件夹下的
.\ezpy.exe_extracted\PYZ-00.pyz_extracted\Litctfbase64.pyc
反编译就能看到编码表,在Cyberchef解码拿flag。
hello_upx#
题目已经提示了是upx壳,用upx -d
命令脱壳出现问题。后来在DIE中发现壳是魔改过的,而且程序是64位。
利用x64dbg
和Scylla
进行手动脱壳。由于第一次手脱,部分思路参考:借助 x64dbg 的 UPX 手工脱壳。
首先动调找到OEP
。查看断点窗口中的入口断点,多次运行直到RIP
指向入口处,该程序是在0x44FF70
。根据esp定律,经过pushad
和popad
后,OEP处的栈顶和现在入口处的栈顶地址是相同的。所以需要在esp指向的内存地址处下一个硬件断点。(寄存器窗口空白处右键)
继续运行至该断点,可以看到刚好是在一系列pop
(popad
)后面,单步跳过至一个大的跳转指令处,跳转后的地址即为OEP
。
接下来要用Scylla
进行dump脱壳,直接使用 IAT Autosearch
功能,期间可能会提示使用 IAT Search Advanced
,选 “是” 继续。然后 Get Imports
,最后直接 Dump
。保存成新的exe文件。
算法部分比较简单,直接写脚本即可。
#include<stdio.h>
int main()
{
unsigned long long v4[3];
v4[0] = 0x707541504072684C;
v4[1] = 0x655158612559632B;
v4[2] = 0x4F5E4E601E5A4E20;
unsigned char *data = (unsigned char *)v4;
char flag[40]={0};
for (int i=0;i<=24;++i)
{
flag[i] = (char)(data[i]+i);
}
printf("%s",flag);
return 0;
}