文件下载地址:http://pwnable.kr/bin/flag
下载文件后,我们先对文件进行例行的检查:
发现这个文件真的是啥保护都没开。。。
emmm 我觉得现在最需要的就是反编译一下看到C源码了。但是我的电脑用IDA不是很好使,心痛,没法用F5大法,于是只能投奔radare或者Hooper
radare用法在这里
但是这些都无果,其实到这里我已经没思路了,所以我无奈,去youtube上看了一下官解
大佬是这样来思考的?
首先file flag
来分析一下这个文件
发现这是一个64位,静态链接的文件。然后让我们来运行一下这个程序:
然后使用strings flag
来试图寻找一些有用的信息,哈哈,大佬还想通过/:)
这种小投机取巧来取得flag。这里补充介绍一下strings命令:
strings命令在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。
然后我们发现这是一个被upx打包过的文件,其实这里可以脱壳一下
一个脱壳笔记,然后再查看源码,但是大佬并没有这么做。。。
大佬接下来的步骤是strace来跟踪了一下程序。(因为上面验证了是静态链接,所以用strace,其常用来跟踪进程执行时的所有系统调用和其所接收的信号。若是动态链接,则用ltrace)
第一行执行的是我们的shell
然后下面有一行brk,我们知道malloc函数是调用brk函数来实现的,接下来就是write和exit_group两个系统调用
于是,放大招了上gdb
输入gdb ./flag
,用catchpoints来捕获退出事件。
然后我们输入r
运行程序,当这个系统调用被调用时我们就会中断。
我们在程序即将退出之前就崩溃了,这可能意味着flag在内存中的某个地方,所以我们可以创建一个core文件来查找这个flag core文件简介(core file,也称core dump,是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。这种信息往往用于调试。)
(ps:我们可以通过sudo bash -c 'echo core.%e.%p > /proc/sys/kernel/core_pattern’命令来使core文件生成在当前目录下,并且命名方式位core+进程名+pid)
让我们来查看一下这个文件
然后通过strings命令,查看可打印字符strings flag-core
,然后查询一下:)
,就可以发现我们的flag