ASIS CTF 2015 keylead

来源:互联网 发布:软件随想录读后感 编辑:程序博客网 时间:2024/06/01 08:47

拿到文件,总之先file一下
这里写图片描述
是一个xz文件,于是

mv keylead keylead.xz
xz -d keylead.xz

得到一个 elf64 位的文件,
先运行一下看下效果
这里写图片描述

可以看出这里是 摇骰子一样的东西,需要我们 enter之后出现的数字符合 3 1 3 3 7
这里找不到更多的信息了,于是打开ida看一下
start 开始处
这里写图片描述
可以看到进入了 sub_400e6e 这里 看来这个就是程序的主要逻辑了,点进去看一下先
代码很长,不过从分支中可以找到一些有用的信息
下面是开始的部分,这写字符和运行程序后看到的一样
这里写图片描述
在下面有
这里写图片描述
这里写图片描述

上面一个是按下enter 之后数字不对所显示的结果, loc_4010d5 打印一段字符串
You rolled as I said! I’,27h,’ll give you the flag.
然后就 调用了 sub_4006b6 这个函数, 上面说 give you the flag 那么这个 sub_4006b6 应该就是要打印出我们要的flag的了,不知道是不是,先运行一下试试 这个函数运行会出现什么,这里在开始的时候start部分是

.text:00000000004005D6                 mov     rcx, offset loc_401110.text:00000000004005DD                 mov     rdi, offset sub_400E6E.text:00000000004005E4                 call    ___libc_start_main

这里将 rdi 的地址改为 sub_4006b6 的地址就可以直接运行 打印flag 的函数了,

gdb调试,先在 0x4005dd 这里 下一个断点, 然后该一下 rdi 寄存器的值就可以了

步骤如下

gdb keylead   # 进入调试环境b *0x4005dd    #设置断点r           #运行程序i r         #查看寄存器的值n       #单步运行i   r         #查看寄存器的值set $rdi=0x4006b6    #设置 rdi寄存器的值c           #继续运行程序

调试结果如下
这里写图片描述

可以看到,直接出现了flag,这里就可以说明前面的逻辑还是没错的,sub_4006b6 就是用来打印flag的函数,至于具体的代码的实现细节之后在进行解析

0 0