BUUCTF--------逆向刷题笔记(持续更新ing)
01.easyre
解题步骤
使用IDA进行打开
快捷键shift+F12查询字符串,再使用Ctrl+f查询关键字符串flag
得到flag
02.reverse1
解题步骤
使用IDA进行打开
快捷键shift+F12查询字符串,再使用Ctrl+f查询关键字符串flag
右键上图的代码,选择List cross references to
进入IDA view-A界面,发现输入的hello_world
使用快捷键F5查看伪代码,发现重要if条件判断
使用快捷键R,将数字转化为字符串,分析转化后的代码可以知道,这个题目是将flag里的o替换成了数字0
得到flag为flag{hell0_w0rld}
03.reverse2
解题步骤
使用IDA进行打开
快捷键shift+F12查询字符串,再使用Ctrl+f查询关键字符串flag,并发现关键信息,hacking_for_fun}可能为flag的一部分。
进入 this is the right flag!代码处,使用右键选择List cross references to
进入伪代码,分析函数发现一个重要的if判断语句,将if函数里的16进制替换成字符串发现代码意思是,将flag中出现的i和r字母替换成1
所以我们尝试将刚刚的得到的hacking_for_fun中的i和r替换成1,提交发现正确。
flag为flag{hack1ng_fo1_fun}
04.reverse——-内涵的软件
解题步骤
运行软件发现,flag被隐藏了,根据题目提示,使用逆向软件IDA打开文件
根据题目提示,使用逆向软件IDA打开文件
发现关键信息,是flag 的形式,尝试提交,发现flag正确,flag{49d3c93df25caad81232130f3d2ebfad}
05.reverse——-helloworld
解题步骤
下载附件发现是apk文件。
使用GDA打开
搜索flag关键字,发现flag
flag为:flag{7631a988259a00816deda84afb29430a}
06.reverse——-新年快乐
解题步骤
查壳,使用PEID查看文件是否有壳(前几题未按照这个步骤进行),发现带有UPX壳
使用UPX脱壳工具进行脱壳
将脱壳后的文件拖入IDA中
使用shift+f12快捷键查看字符串,使用ctrl+f查询flag关键词
右键查看,接着F5查看伪代码
分析伪代码可以知道输入Str1需要和v1(v1的内容是HappyNewYear!)进行字符串比较,如果两者的字符串一样,则输出this is true flag!
1
2qmemcpy(&v1, "HappyNewYear!", 0xEu);
*(_WORD *)Str1 = 0;1
2if ( !strncmp(Str1, &v1, strlen(&v1)) )
result = puts("this is true flag!");经过函数的分析可知flag为flag{HappyNewYear!}
07.[GWCTF 2019]pyre
解题步骤
下载附件发现得到的是一个pyc的文件,我们可使用python的在线解密网站进行解密,将pyc的文件转化为python代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 2.7
print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):
num = ((input1[i] + i) % 128 + 128) % 128 //主要是对code数组里的数据进行着两个运算的逆运算
code += num
for i in range(l - 1):
code[i] = code[i] ^ code[i + 1]
print code
code = [
'%1f',
'%12',
'%1d',
'(',
'0',
'4',
'%01',
'%06',
'%14',
'4',
',',
'%1b',
'U',
'?',
'o',
'6',
'*',
':',
'%01',
'D',
';',
'%',
'%13']根据代码写出解密脚本为
1
2
3
4
5
6code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14',
'4', ',', '\x1b', 'U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13']
for i in range(len(code)-2,-1,-1):
code[i]=chr(ord(code[i])^ord(code[i+1]))
for i in range(len(code)):
print(chr((ord(code[i])-i)%128),end="")所以答案为GWHT{Just_Re_1s_Ha66y!}
08.[ACTF新生赛2020]easyre
解题步骤
下载附件进行查壳发现存在upx壳
使用工具进行脱壳,在此处下载脱壳工具,执行以下两个命令
1
upx.exe -d //进行安装upx脱壳工具
1
upx.exe -h 文件绝对路径
再次进行查壳发现无壳
使用IDA进行打开
09.[WUSTCTF2020]level1
解题步骤
查壳,将拿到的附件载入查壳工具,发现64为且无壳。
将程序载入64位IDA pro,进行关键字的检索,快捷键shift+F12,发现无关键词
发现main函数,双击进入。
使用tab键或者F5快捷键进行汇编代码的查看。
发现关键代码,进行相关的分析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20int __cdecl main(int argc, const char **argv, const char **envp)
{
int i; // [rsp+4h] [rbp-2Ch]
FILE *stream; // [rsp+8h] [rbp-28h]
char ptr[24]; // [rsp+10h] [rbp-20h] BYREF
unsigned __int64 v7; // [rsp+28h] [rbp-8h]
v7 = __readfsqword(0x28u);
stream = fopen("flag", "r");
fread(ptr, 1uLL, 0x14uLL, stream); //对文件进行操作,正好附件中有个文件是这个算法的输出结果
fclose(stream);
for ( i = 1; i <= 19; ++i ) //关键的循环操作,进行了19次循环
{
if ( (i & 1) != 0 ) //如果数组的下标是偶数时
printf("%ld\n", (unsigned int)(ptr[i] << i)); //如果数组的下标是偶数时,进行这个操作移位操作,逆向的思路(ptr[i] >> i))
else
printf("%ld\n", (unsigned int)(i * ptr[i]));//如果数组的下标是奇数时,进行这个操作i * ptr[i],逆向的思路 ptr[i]/i
}
return 0;
}逆向代码编写之py代码
1
2
3
4
5
6
7
8ptr = [198,232,816,200,1536,300,6144,984,51200,570,92160,1200,565248,756,1474560,800,6291456,1782,65536000]
flag=""
for i in range(1, 20):
if i % 2 == 1:
flag =flag+chr(ptr[i-1] >> i)
else:
flag = flag+chr(ptr[i-1] // i)
print(flag)逆向代码编写之C语言代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int ptr[] = {198, 232, 816, 200, 1536, 300, 6144, 984, 51200, 570, 92160, 1200, 565248, 756, 1474560, 800, 6291456, 1782, 65536000};
int main()
{
char flag[20];
int i;
for (i = 1; i <= 19; ++i)
{
if (i % 2 == 1)
{
flag[i-1] = (char)(ptr[i-1] >> i);
}
else
{
flag[i-1] = (char)(ptr[i-1] / i);
}
}
flag[19] = '\0'; // 添加字符串结尾的空字符
printf("%s\n", flag);
return 0;
}运行结果截图