攻防世界练习题easyre-153
easyre-153
借此题熟悉gdb操作
收集信息
32位elf文件,丢进kali里执行一下
还等着我们输入什么东西,随意输入个字串,结果什么都没返回。
ida分析
逻辑直接无法理解,因为出现了几个没见过的函数
查阅了一下函数的相关信息
fork函数:创建一个子进程,对父进程该函数返回子进程的id,对子进程该函数返回0;
pipe函数:初始化一个管道,管道【1】只可以写入,管道【0】只读。借此实现两个进程的通信
这样就可以读懂这个程序的逻辑了:
- 子进程输出 OMG。。。,然后退出,退出前将一串子串传入了管道
- 父进程读取管道内容,然后等待我们输入,我们输入的对了,就输出成功的回应。
我们不知道子进程的id,这里动态调试直接跳过去就OK了,来到lol函数,结果输出的内容是?
但是不对啊
这里明明传入了一个参数
可以看到,该函数的汇编与伪c代码大相径庭!
动态调试
- set follow-fork-mode parent/child 可以控制gdb跟进调试哪个进程
- set $eflags ^= 0x40就可以快速更改ZF标志位的值
通过上面两条命令,一直跟进到lol函数内部
这里可以看到栈中存放的两个参数,一个是flag,一个是format
这里printf并没有输出flag,我们需要清空缓冲区
call (int)fflush(0)
就得到了flag了
总结
此题关键在于
- 了解fork函数的作用,理清进各进程的运行逻辑
- 注意伪代码可能会和汇编源代码差很多,以汇编代码为准。