re1
exe文件,查壳

无壳,32位,拖入ida
找到主函数,看伪代码

两个参数
xmmword_413E34:3074656D30633165577B465443545544h
v6 :0x7D465443545544i64
__m128i类型
__m128i 类型
-
__m128i是一个128位整数向量类型,通常用于SIMD(单指令多数据)编程。SIMD是一种并行计算技术,允许单条指令同时对多个数据进行操作,从而提高程序的性能。 -
在Intel的SIMD指令集(如SSE、AVX等)中,
__m128i类型被广泛使用。它可以在一个寄存器中存储多个整数(如16个8位整数、8个16位整数、4个32位整数或2个64位整数),并允许对这些整数进行并行操作。
v5 = _mm_loadu_si128((const __m128i *)&xmmword_413E34);
-
_mm_loadu_si128:这是SIMD指令集中的一个函数,用于从内存中加载128位整数向量。_mm_loadu_si128函数的名称中的u表示“unaligned”,即内存地址可以是未对齐的。这意味着加载的数据可以位于任意内存地址,而不需要16字节对齐。 -
(const __m128i *)&xmmword_413E34:这是一个类型转换表达式,将内存地址xmmword_413E34转换为const __m128i *类型的指针。xmmword_413E34是一个内存地址,通常是一个标签或变量名,表示要加载的数据的起始位置。
这行代码的主要用途是从内存地址 xmmword_413E34 开始的位置加载128位整数向量数据,并将其存储到变量 v5 中。这样,v5 就可以用于后续的SIMD操作。
切换到汇编发现就是v5和v6
将他们合并并将十六进制转换为字符
串
这里涉及到大小端转序的问题,一方面发现花括号的位置有问题,另一方面打开ida的Hex View视图可以看到与汇编相反
所以flag是
DUTCTF{We1c0met0DUTCTF}
logmein
下载后无法判断是什么格式的文件,初步判断可能是linux系统环境的

64位,elf文件,拖入ida,找到main函数,看伪代码

两个参数,一个简单的算法
v8 AL_RT^L*.?+6/46
v7 ebmarah
flag在s中,跟v8一个长度
```
s[i] != (char)(v8[i % v6 - 8] ^ v8[i]) )
```
i % v6 - 8必定小于0,同时由于v7也涉及到大小端序存储,所以其实这在取的是v7
按照算法,编写脚本

no-strings-attached
查壳
32位,elf,无壳
重点是decrypt函数
本质上是两个数组对应做减法,数字少的那个数组用完一遍再再用一遍 ,两个数组就是s 和dword_8048A90
用汇编看一下s和dword_8048A90里面的内容
用插件lazyida将内容提取出来
编写脚本
#include <stdio.h>
#include <string.h>
int main(){
unsigned char s[] = {
0x3A, 0x14, 0x00, 0x00, 0x36, 0x14, 0x00, 0x00, 0x37, 0x14, 0x00, 0x00, 0x3B, 0x14, 0x00, 0x00,
0x80, 0x14, 0x00, 0x00, 0x7A, 0x14, 0x00, 0x00, 0x71, 0x14, 0x00, 0x00, 0x78, 0x14, 0x00, 0x00,
0x63, 0x14, 0x00, 0x00, 0x66, 0x14, 0x00, 0x00, 0x73, 0x14, 0x00, 0x00, 0x67, 0x14, 0x00, 0x00,
0x62, 0x14, 0x00, 0x00, 0x65, 0x14, 0x00, 0x00, 0x73, 0x14, 0x00, 0x00, 0x60, 0x14, 0x00, 0x00,
0x6B, 0x14, 0x00, 0x00, 0x71, 0x14, 0x00, 0x00, 0x78, 0x14, 0x00, 0x00, 0x6A, 0x14, 0x00, 0x00,
0x73, 0x14, 0x00, 0x00, 0x70, 0x14, 0x00, 0x00, 0x64, 0x14, 0x00, 0x00, 0x78, 0x14, 0x00, 0x00,
0x6E, 0x14, 0x00, 0x00, 0x70, 0x14, 0x00, 0x00, 0x70, 0x14, 0x00, 0x00, 0x64, 0x14, 0x00, 0x00,
0x70, 0x14, 0x00, 0x00, 0x64, 0x14, 0x00, 0x00, 0x6E, 0x14, 0x00, 0x00, 0x7B, 0x14, 0x00, 0x00,
0x76, 0x14, 0x00, 0x00, 0x78, 0x14, 0x00, 0x00, 0x6A, 0x14, 0x00, 0x00, 0x73, 0x14, 0x00, 0x00,
0x7B, 0x14, 0x00, 0x00, 0x80, 0x14, 0x00, 0x00, };
unsigned char dword_8048A90[] = {
0x01, 0x14, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x03, 0x14, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00,
0x05, 0x14, 0x00, 0x00, };
for(int i=0;i<152;i++){
s[i]-=dword_8048A90[i%20];
if(s[i]>32&&s[i]<128){
printf("%c",s[i]);
}
}
我这里不想一个一个删除0x00了,所以我加了个限制条件,只打印对应的在范围内的字符
flag就是9447{you_are_an_international_mystery}
insanity
查壳,很简单的一道题,会shift+f12查找字符就行


flag是9447{This_is_a_flag}
Hello, CTF
固定流程,查壳,exe文件,拖入ida,看主函数
看似较长,但有用的代码就几行
reverse的一个超越所有技术的重要思想就是不用过多纠结于无用的代码(当然要是想要学习除外)
sprintf(Buffer, "%x", v4);
sprintf 是 C 语言标准库中的一个函数,用于将格式化的数据写入字符串。这个函数非常类似于 printf,但输出目标是一个字符数组而不是标准输出。
%x 十六进制
参数v13 437261636b4d654a757374466f7246756e
flag先存储在v9中,然后再到v4里,最后以十六进制存储在Buffer中
由于memset清空了v10,所以strcat并没有什么作用相当于strcpy
总之就是输入的flag的十六进制是v13
flag是CrackMeJustForFun
[ACTF新生赛2020]easyre
查壳,发现有upx壳
exe的文件形式,直接用工具脱壳
脱完后进入ida,看主函数
可见输入的flag必须是ACTF{...}的形式
v4[i] != byte_402000[*((char *)v5 + i) - 1]
关键语句
参数
v4 *F'"N,"(I?+@
byte_402000 }|{zyxwvutsrqponmlkjihgfedcba`_^][ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=;:9876543210/.-,+*)(',27h,'&%$# !"
byte_402000我确认了几遍才正确(双引号和27h都不要忘)
开始编写脚本
v4 = [42,70,39,34,78,44,34,40,73,63,43,64]
string = chr(0x7E)+"}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(" + chr(0x27) + '&%$# !"'
flag=""
for i in v4:
for j in range(1,len(string)):
if i == ord(string[j]):
flag+=chr(j+1)
print ("ACTF{"+flag+"}")
[MRCTF2020]Xor
exe文件,查壳,拖入ida,找主函数
32位
发现无法反汇编,由于我的汇编没有那么强,我选择不去直接看汇编代码,而是选择解决报错
先到对应地址看一下啊,发现这里的指令是调用函数,然后发现是参数个数不匹配,在对应函数上按y键,改一下参数个数
然后就可以看伪代码了
整体就是一个简单的异或
脚本
rflag = "MSAWB~FXZ:J:`tQJ\\"N@ bpdd}8g" flag = "" for i in range(27): flag += chr(ord(rflag[i]) ^ i) print(flag)
flag就是flag{@_R3@1ly_E2_R3verse!}
[Zer0pts2020]easy strcmp
查壳,文件形式也不知道,拖入ida,找主函数
弄了半天也没搞懂这道题在干什么,只知道是这个形式zer0pts{********CENSORED********}
看了别人的wp才明白是什么回事
init函数
跟进sub_795,off_201028被置为sub_6EA函数地址了, off_2010288实际上是strcmp函数的地址,但现在它被替换成了sub_6EA
因此我们执行strcmp函数时实际上是执行sub_6EA函数
解密脚本
int main()
{
char p[] = "zer0pts{********CENSORED********}";
uint64 k[4] = { 0, 0x410A4335494A0942, 0x0B0EF2F50BE619F0, 0x4F0A3A064A35282B };
for (int i = 0; i < 4; i++)
{
*(uint64*)&(p[i*8]) += k[i];
}
cout << p;
}
flag就是zer0pts{l3ts_m4k3_4_DETOUR_t0d4y}
881

被折叠的 条评论
为什么被折叠?



