buuctf reverse 学习报告(1-10)
1.easyre
DIE查壳,64位无壳,IDA打开,shift+f12
2.reverse1
DIE查壳,64位无壳,IDA打开,shift+f12
继续跟进
strcmp,对比str1,str2,若相等则结果为0,!0则表示成立,执行中间的语句,所以跟进这2个str
发现str2中有东西,但观察之前的代码
快捷键R将数字转换为ASCII码表,循环把字母o—>数字0,所以flag{hell0_w0rld}
3.reverse2
DIE查壳,64位无壳,IDA打开,shift+f12
发现关键,很像flag后半部分,再跟进上面的,
在循环中把 i 和 r 换成了 1
这就是完整flag———>flag{hack1ng_fo1_fun}
4.内涵的软件
DIE查壳,32位无壳,IDA打开,shift+f12
Ctrl+F搜索flag
先进去看一眼,看不懂,放一边,感觉没用,接着看
发现提示和可疑字符串,跟进后发现没什么用,只得到了像flag的东西,试着提交,对了
flag{49d3c93df25caad81232130f3d2ebfad}
5.新年快乐
DIE查壳,32位有壳,先脱壳,IDA打开,shift+f12
跟进,
分析,对比str1和str2,简单判断,flag为flag{HappyNewYear!}
6.xor
1.看名字可能与异或运算有关系
DIE查壳,64位无壳,IDA打开,shift+f12
发现关键,跟进
分析伪代码,首先memset函数应该是清空了 __b 的内容,然后输入一个长为33的字符串,同时判断 __b 中的第二项到最后一项(因为i从1开始)是否和global一样,是的话就success
提取内容
fkw&O.@xZ;UpFv"M#DghG2O
写脚本转换
a=[102,10,107,12,119,38,79,46,64,17,120,13,90,59,85,17,112,25,70,31,118,34,77,35,68,14,103,6,104,15,71,50,79,0]
q="f"
for i in range(1,33):
q+=chr(a[i]^a[i - 1])
print(q)
得到结果
flag{QianQiuWanDai_YiTongJiangHu}
7.reverse 3
DIE查壳,32位无壳,IDA打开,shift+f12
明显的base64提示和flag,猜测加密过,跟进flag字符串
发现主要的代码,分析,首先看 if 判断,比较了destination和str2字符串,双击查看一下,发现了str2中有加密过的flag
分析上面的代码,知道flag在输入后第一位的ASCII加0,第二位加1,以此类推,写脚本解密
因为原来是 + ,所以逆过来是 -
代码如下
str="e3nifIH9b_C@n@dH"
flag=""
for i in range(len(str)):
flag+=chr(ord(str[i])-i)
print(flag)
得出e2lfbDB2ZV95b3V9,在base64解密得出flag{i_l0ve_you}
8.helloword
是个APK文件,记得选择APK打开
ift+f12,CTRL+F,搜索flag
发现flag{7631a988259a00816deda84afb29430a}
9.不一样的flag
DIE查壳,32位无壳,IDA打开,shift+f12
发现端倪
跟进看看,
发现main函数,把一串01数字序列复制给v3,进入永真循环,显示你可以选择一个行为开始执行
1234代表上下左右,scanf 读取键盘录入的数据, v5 ,如果是2(下)就继续执行,其他的则退出
再分析,发现最后一个是#才会正常结束,如果碰到 1 ,就异常退出,没思路了,看了下别的师傅的文章,才知道是迷宫(其实这最后一句,也是提示,说明输入的顺序决定了走向,不能碰到 1 ,那就是按着 0 走,排了一下位置,应该是这样的)
所以键盘应该输入222441114422 即flag{222441114422}
10.SimpleRev
老样子,64位无壳,shift+f12
跟进
分析主体部分,看最后判断的是text和str2,双击查看一下,发现啥都没有,往上看
text中加入了 key3 ,看一下key3里面
又把 key1 复制给了key
strcat() 函数作用是把前后两个字符串连接起来,
接下来的 for 循环对 key 中的满足条件的字符进行了变换,写脚本实现变换
#include<stdio.h>
int main()
{
char key[6] = { 'A','D','S','F','K' };
int v5 = strlen(key);
int v3 = 0;
for (int i = 0; i < v5; ++i)
{
if (key[v3 % v5] > 64 && key[v3 % v5] <= 90)
key[i] = key[v3 % v5] + 32;
++v3;
printf("%c", key[i]);
}
}
发现就是变了个小写,变成 adsfk
对上面的毫无头绪,查了一下快捷键
将src 和 v9 的数据转为十六进制,快捷键H。快捷键R 将其转为字符