0x01.查壳和查看程序的详细信息
32位 ELF文件
0X02.使用IDA对程序进行分析
查看字符串并没有与flag有关的字符串,直接分析main函数
通过观察,可以判断authenticate这个函数与flag有关,其中有个decrypt函数,应该用来生成flag的,将生成的结果返回给s2,之后将我们的输入与s2(flag)比较,接下来就去分析flag这个函数
虽然不是特别明白flag是怎么生成的,但是可以看到dest肯定是用来存储flag的,因为这个函数是将flag的值返回给s2的,那么他的返回值dest此时肯定已经是正确的flag了,
这里有两种思维方式:
一,直接分析decrypt函数的运算逻辑,写脚本,自己将flag生成出来
二,用动态调试直接查看flag
这里我先用第一种
之后直接查看decrypt函数的汇编代码,看flag会被存储在哪个地方
这里选择从下往上分析,因为函数返回的时候flag已经生成完毕,准备返回给s2了,这个时候在函数要释放空间之前,肯定会将返回值保存起来(以前听师兄说过好像一般都会放在eax中,这个有点忘记了,还是多做点题积累经验吧)
0x03.用GDB进行调式
选择在函数结束的地方下断点,因为此时eax中保存的会是flag的值,
用x/6ws $eax查看寄存器的值(PS:x/ 命令要好好学一下,不太会用)
成功!!!
这里再补充一下x命令吧
x/200wx $eax
x:就是用来查看内存中数值的,后面的200代表查看多少个,wx代表是以word字节查看看,$eax代表的eax寄存器中的值
x/6sw $eax
6:显示6行数据
s:字符串形式
w:word(4字节)形式