1.12 buuctf逆向基础题目
1.12 buuctf逆向基础题目
1.easyre
打开程序就一个黑框,输入东西也没有反应
直接ida打开
在这个汇编逻辑框里就能看到flag了,也可f5查看伪代码得到
2.reverse1
打开题目要求输flag,随机输了几个数字直接关闭程序了
老样子打开ida分析
一开始没找到啥有用的东西,shift+f12之后看到第四行有一个跟flag相关的东西,点击跟进。
跟进后点击下面的数据继续跟进然后f5查看伪代码
伪代码如下
由上面if那行,可以得知是替换,将ascii码为111的字符替换为ascii码为48的字符,即o替换为0
于是我们跟进原始的数据,将这个字符串中的o替换为0即可得到flag
3.reverse2
下载得到一个文件,直接用ida打开观察主函数并查看伪代码如下
这里可以观察到一个明显的替换,将字符串中ascii码为105,114的字符替换为ascii码为49的字符。即将i和r替换为1,于是我们找到flag的原始字符串,点击flag跟进
替换后得flag{hack1ng_fo1_fun}
4.内涵的软件
打开题目如图,输入y/n提示错误后退出
在主函数中并没有找到什么有价值的东西
于是shift+f12发现一个格式和flag很像的字符串
跟进一下
没有啥替换变化之类的,推测flag就是花括号里面的那一串,于是把前缀改为flag交上去就对了
5.新年快乐
下载打开程序
第一步让我们输入flag,随机输入几个数自动弹出
脱进ida观察,这样子一看就是加了壳的
Peid观察一波发现有一个upx的壳
于是开始脱壳
将程序拖进专用破解虚拟机
用工具成功脱壳
拿回win10重新用ida打开,现在程序就正常了
分析主函数,直接可得到flag的明文,为HappyNewYear!
于是flag为flag{HappyNewYear!}
6.xor
Xor是异或的意思,猜测程序考察的是逆向异或运算。下载程序解压得到一个文件和一个文件夹,我们直接分析那个单独的文件就行了,用ida打开,主函数代码如下
- int __cdecl main(int argc, const char **argv, const char **envp)
- {
- int i; // [rsp+2Ch] [rbp-124h]
- char __b[264]; // [rsp+40h] [rbp-110h] BYREF
- memset(__b, 0, 0x100uLL);
- printf("Input your flag:\n");
- get_line(__b, 256LL);
- if ( strlen(__b) != 33 )
- goto LABEL_7;
- for ( i = 1; i < 33; ++i )
- __b[i] ^= __b[i - 1];
- if ( !strncmp(__b, global, 0x21uLL) )
- printf("Success");
- else
- LABEL_7:
- printf("Failed");
- return 0;
- }
可以由strlen函数得知程序中字符串长度为33,global是逆向后的字符串,于是点击global跟进
在点击显示完整如下
最终人工整理得字符串如下
16进制下该字符串表示为
根据主函数中的
- __b[i] ^= __b[i - 1];
由于异或运算具有自反性质,我们可以逆向得到其原来的字符串。
开始写python脚本如下
- a=[0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26,
- 0x4F, 0x2E, 0x40, 0x11, 0x78, 0x0D,
- 0x5A, 0x3B, 0x55, 0x11,
- 0x70, 0x19, 0x46, 0x1F, 0x76, 0x22,
- 0x4D, 0x23, 0x44, 0x0E, 0x67,
- 0x06, 0x68, 0x0F, 0x47, 0x32,0x4F]
- s=''
- s+='f'
- for i in range(1,len(a)):
- s+=chr(a[i]^a[i-1])
- print(s)
由于flag第一位也是f,所以提前加上去单独列出,执行该程序可得flag
得到flag{QianQiuWanDai_YiTongJiangHu}
本文来自博客园,作者:wysng,转载请注明原文链接:https://www.cnblogs.com/wysngblogs/p/15792494.html
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。