buuctf做题记录
查壳

无壳32位
IDA反编译
试图直接对main函数反编译会弹出提示:

所以查看401095处的汇编:

点进sub_401020,F5反编译:


返回main函数处,再次F5,反编译成功:

方法指导
分析
简单分析,函数有printf,scanf,system等,进行一个重命名和隐藏不需要的显示,逻辑就很清晰了:

首先判断是否输入33个字符
然后对每个字符按从0到32的索引号对该字符进行异或
最后将异或后的字符与byte_41EA08比较,相同就输出Right
查看byte_41EA08内容:

注意不要漏掉4D(‘M’)
写个简单的C++脚本吧:
#include<iostream>
using namespace std;
int main()
{
int c[] = {0X4D,0X53,0X41,0X57,0X42,0X7E,0X46,0X58,0X5A,0X3A,0X4A,0X3A,0X60,0X74,0X51,0X4A,0X22,0X4E,0X40,0X20,0X62,0X70,0X64,0X64,0X7D,0X38,0X67};
for(int i=0;i<33;i++)cout << (char)(c[i]^i);
}
得到flag:

buuctf的要求是包上flag{}
所以提交falg:
flag{@_R3@1ly_E2_R3verse!}
小记
摸鱼后的复建,慢慢来吧()
本文记录了一次buuctf的逆向工程题目,通过IDA反编译分析函数逻辑,发现需要对输入字符串进行异或操作并与预设的字节序列比较。最终,使用C++编写脚本得出解密后的flag,并按照buuctf的格式提交。这个过程涉及逆向分析、字符串解密和C++编程。
540

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



