CTF

二进制分析实战第五章(5)

Posted by Kody Black on September 13, 2023

第五章 Linux二进制分析

分析lvl5文件

$ file lvl5
lvl5: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=1c4f1d4d245a8e252b77c38c9c1ba936f70d8245, stripped
$ ./lvl5
nothing to see here
$ ltrace ./lvl5
__libc_start_main(0x400500, 1, 0x7ffc7f1b0358, 0x4006f0 <unfinished ...>
puts("nothing to see here"nothing to see here
)                                                                      = 20
+++ exited (status 1) +++

lvl5是普通的ELF文件,执行后只输出”nothing to see here”,使用ltrace也可以发现它确实只调用了put

使用IDA pro进行分析,发现main函数只是输出”nothing to see here”,其它什么也没有做。

进一步研究其他函数,发现函数sub_400620如下:

16945686476121694568647201.png

估计这个函数肯定和flag有关,查看交叉引用情况,发现该函数并没有被任何位置调用

所以尝试修改程序入口,使得其进入sub_400620。

进入start函数,找到main函数入口为40053D。

16946207445961694620744474.png

修改mov指令,将main的地址改为sub_400620的地址。 16946207729581694620772675.png

保存后重新执行该程序,得到了flag

$ ./lvl5
key = 0x00400620
decrypted flag = 0fa355cbec64a05f7a5d050e836b1a1f

其他方法

首先,我们不应该直接找有哪些函数,应该现在ida上查看字符串情况

16945699356121694569935167.png

再从decrypted flag这里找到被引用位置,从而进入函数sub_400620。

另外,也不一定非要修改文件内容,可以通过GDB进行动态修改。即在执行完0x40053D后,将rdi修改为sub_400620函数的地址。

Breakpoint 1, 0x0000000000400544 in ?? ()
gdb-peda$ set $rdi=0x400620
gdb-peda$ c
Continuing.
key = 0x00400500
decrypted flag = ea36cbE`64A35fb5d60e06bb1f

貌似有些bug,不过就是这个意思。flag有问题的原因尚不明确。