第五章 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如下:
估计这个函数肯定和flag有关,查看交叉引用情况,发现该函数并没有被任何位置调用
所以尝试修改程序入口,使得其进入sub_400620。
进入start函数,找到main函数入口为40053D。
修改mov指令,将main的地址改为sub_400620的地址。
保存后重新执行该程序,得到了flag
$ ./lvl5
key = 0x00400620
decrypted flag = 0fa355cbec64a05f7a5d050e836b1a1f
其他方法
首先,我们不应该直接找有哪些函数,应该现在ida上查看字符串情况
再从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有问题的原因尚不明确。