一点二进制
虽然转到二进制已经有段时间了。。但是却没写过什么题目,所以在 buu 找到了些简单的题目来写。
easyre
首先是第一题,easyre。
题目给了个可执行文件,先放到 exeinfo 里面看看情况。
所以是个没加壳层的64位程序,用 ida64 打开并找到 main 函数。
按下 f5 生成伪代码,flag 如图所示。
reverse1
丢到 exeinfo 分析。
直接运行试试。
拖到 ida 里面看看。
按下 shift + f12 ,切换到字符串的界面,联想到运行时的 "input the flag" 和 "wrong flag" , 可以通过查找交叉引用找到调用的函数。
不难发现这个地方的 sub_14001128F() 函数应该是类似于 scanf() 一类的函数,将用户输入存入 Str1 中并与 Str2 比较。
所以只要找到 Str2 的值就能找到 flag 。
显然代码上半部分对 Str2 进行了处理,首先我们找到 Str2 的原始值。
显然 Str2 = "{hello_world}",再来看看上面的代码,是将 Str2 中的 ascii 码为 111 的字符替换为 48 。
在这两个数字上按下 r ,结果如图。
所以 flag 即为 "{hell0_worl0}" 。
reverse2
不是 win 上的可执行程序。。所以直接拖到 ida64 上看看。
如法炮制,同样是通过找寻找使用类似 “flag” 字样的字符串找到主函数。
这里已经将数字转换成了 ascii 字符,所以只要找到 flag 的原始值即可。
所以加密后的 flag 为 "{hack1ng_fo1_fun}" 。
reverse3
用 exeinfo 查看信息。
无壳32位程序,先尝试运行。
拖到 ida 里面,先去找找有无包含 "flag" 字样的字符串。
的确找到了,但是也出现了一条奇怪的字符串,非常像是 base64 编码使用的字母。
通过 "wrong flag!" 找到主函数。
函数伪代码比较长,为了分析方便,再贴一段代码块。
1 |
|
22行应该是读取输入到 Str ,24行将 v4 拷贝到 Destination 上,然后27~28将 Destination 上每一位都加上所在下标。
所以搞清楚 v4 是什么就可以求出 Destination 了,所以接下来来看看24行的那个奇怪函数究竟做了什么。
emmm, 完全看不懂,但是里面有个奇怪的变量,点进去看看。
猜测这个函数应该用于 base64 编码,那么 main 函数里面干的事情就如下。
- Destination: [char;100] 置0。
- 读入输入至变量 Str 中。
- 将 Str base64 加密后存入 v4。
- 将 v4 拷贝到 Destination 上。
- 将 Destination 上每一位都加上自己的下标。
- 比较 Destination 和 Str2 。
继续查找 Str2 。
综上,可以编写以下脚本。
1 |
|