攻防世界练习题easyre-153

easyre-153

借此题熟悉gdb操作

收集信息

image-20220426114553016

32位elf文件,丢进kali里执行一下

image-20220426115120956

image-20220426115126096

还等着我们输入什么东西,随意输入个字串,结果什么都没返回。

ida分析


逻辑直接无法理解,因为出现了几个没见过的函数

查阅了一下函数的相关信息

fork函数:创建一个子进程,对父进程该函数返回子进程的id,对子进程该函数返回0;

pipe函数:初始化一个管道,管道【1】只可以写入,管道【0】只读。借此实现两个进程的通信

这样就可以读懂这个程序的逻辑了:


  1. 子进程输出 OMG。。。,然后退出,退出前将一串子串传入了管道
  2. 父进程读取管道内容,然后等待我们输入,我们输入的对了,就输出成功的回应。

我们不知道子进程的id,这里动态调试直接跳过去就OK了,来到lol函数,结果输出的内容是?image-20220426120217477

但是不对啊

image-20220426120241640

这里明明传入了一个参数

image-20220426120516374

可以看到,该函数的汇编与伪c代码大相径庭!

动态调试

  • set follow-fork-mode parent/child 可以控制gdb跟进调试哪个进程
  • set $eflags ^= 0x40就可以快速更改ZF标志位的值

通过上面两条命令,一直跟进到lol函数内部

image-20220426121040325

这里可以看到栈中存放的两个参数,一个是flag,一个是format

这里printf并没有输出flag,我们需要清空缓冲区

call (int)fflush(0)

就得到了flag了

总结

此题关键在于

  1. 了解fork函数的作用,理清进各进程的运行逻辑
  2. 注意伪代码可能会和汇编源代码差很多,以汇编代码为准。
posted @ 2022-04-26 20:32  点墨留白  阅读(143)  评论(0编辑  收藏  举报