Buuctf学习报告1-10
-
Easyre:
文件拖入ida即可看到答案
-
2.Reverse1
首先DIE查壳,发现64位无壳,拖入ida
汇编语言晦涩难懂,shift+f12查看文件字符串,发现关键字符串,点击进入该字符串所在位置
Ctrl+x查看该字符串所在函数,依旧f5查看其伪c代码
sub_140011D1S是printf语句,不难发现,sub_14001128F是scanf,而strncmp表示比较str1和str2,如果括号内为真,则得到正确flag,即str1和str2相等时为真,返回0,想到str2的值是多少很关键,双击str2查看其所在位置,再次发现关键语句
但是代码真的分析完了吗?返回去继续向上分析代码
数字想到ascii码表,R可直接转换,发现str2中的o要替换成0
那么最终答案就是
flag{hell0_w0rld}
3. reverse2
查壳无壳拖入64位IDA,汇编语言晦涩难懂f5转化成伪c代码,找到关键语句
不难发现strcmp是对flag和s2进行了比较,追踪flag,发现flag
但测试不通过,答案没那么简单,返回重新分析代码
发现flag仍需进行转换,Rascii码转换之后得到,flag中的i和r需要转化成1
最终得到flag{hack1ng_fo1_fun}
4.内涵的软件
查壳无壳拖入64位IDA,汇编语言晦涩难懂,shift+f12查看字符串
发现关键含flag语句
双击进一步查看,继续ctrl+x查看语句所在位置
发现没有找到什么有用信息,返回重新查看main函数,查看main0函数
发现这一串很可疑,尝试发现就是flag
所以flag {49d3c93df25caad81232130f3d2ebfad}
5.新年快乐
查壳发现有upx壳,需要进行脱壳处理,将文件拖进upx文件里,位置栏输入cmd,调出命令窗口,输入upx -d 新年快乐.exe
脱壳成功
重新拖入ida
容易发现,str1和str2进行比较,如果相等即为正确flag
Str2已经确定
因此最终flag{HappyNewYear!}
6.xor
看到xor联想到异或运算,查壳无壳,拖入ida,f5查看伪c代码
分析代码可知,先是将__b清空为0,再输入其值
当__b的长度不是33是错误,因此__b的长度是33,当__b异或运算之后和globle相等,可以得到Success
点击globle跟进,继续跟进点击aFKWOXZUPFVMDGH,得到一个古怪可能是flag的一串字符
提取出字符
编写代码
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.reverse3
查壳无壳拖入ida,进一步查看main0函数,找到主函数
Destination和str2进行比较,相等即为right flag
点击str2,发现一串特殊字符类似flag
很明显这并不是flag,猜测可能是经过某种加密之后的结果
返回main0函数继续分析代码
由下往上分析,v5是Des的字符长度,在往上是对Des做了个循环,如果Des长度是3,那么Des[0]=Des[0]+0
以此类推
再往上发现最初输入的v4的值赋给了Des,之后第24行进行了某种运算得到了后来的Des
因此关键就是进行了什么运算,点击sub_4110BE,继续跟进
又是/3,又是4*,那么猜测可能是base64加密,借助工具解码
得到结果
flag{i_l0ve_you}
8.helloword
查壳无壳拖入ida,直接shift+f12查看字符串
ctrl+f搜索flag,发现flag
得到结果
flag{7631a988259a00816deda84afb29430a}
9.不一样的flag
查壳无壳拖入ida,f5查看伪代码
找到关键语句,翻译得到我输入的顺序就是flag,往上看发现数字,自然将其ascii转换,得到
49转换成1,35转换成#
发现这串字符可以分为5行5列:
*1111
01000
01010
00010
1111#
很明显这是一个迷宫题,要求不走1,从*走到#
而行走的顺序就是flag
所以我们的顺序是:222441144222
得到flag:
flag{222441144222}
10.SimpleRev
查壳无壳拖入ida,f5查看伪代码
发现v4不等于d且不等于D的时候会执行Decry函数,进去看看函数里有什么
函数中发现关键语句,text和str2进行比较,点进text和str2发现没有什么有用信息,继续向上分析代码
将src 和 v9 的数据转为十六进制,快捷键H。快捷键R 将其转为字符
了解题目意思知道,大端序和小端序知识点
因此这里src = NDCLS ,v9 = hadow,key进行大小写转换
所以text=killshadow
key=adsfkndcls
发现求出str2的关键是 str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
编写代码求出str2
#include<stdio.h>
int main()
{
char key[] = "adsfkndcls";
char text[] = "killshadow";
int i;
int v3=10;//长度
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 128; j++)
{
if (j < 'A' || j > 'z' || j > 'Z' && j < 'a')
{
continue;
}
if ((j - 39 - key[v3 % 10] + 97) % 26 + 97 == text[i])
{
printf("%c",j);
v3++;
break;
}
}
}
}
得到flag