根据题目和前期出现的字符串,可以搜索到一首歌My Best Friends InThe World(What Am I To You?)。对比这首歌可以看出我们得到的歌词顺序是乱序。
一大堆赋值结束后,在0x401890处把第一句歌词的内存地址放到了[rbp-0x8]的位置,0x00007ffd54ce2290(为了书写方便,之后不写7ffd54ce了)。
取了输入的第一个字符,存到了[rbp-0x11],比较是否为0
从0x004018db到0x4018f1,根据[输入的第一个字符-65+32]得到了下一句歌词。下一句歌词的地址是存储在内存地址rax+rdx*0x8处的。[rbp-0x8]存储的是第一句歌词的地址,这里有一个mov rax,[rbp-0x8]的操作,把第一句歌词的地址给了rax。rax=0x2290
根据搜索到的歌曲,得到下一句歌词是“I should have just told you”,查看它所在位置。从下图中可以看到,0x1b70处存储的是这句歌词,而存储这个地址的内存有两个,一个是0x2268另一个是0x23a0。也就是说rax+rdx*0x8=0x2268 or 0x23a0,而已知rax=0x2290,因此rax+rdx*0x8=0x23a0,由此推断出rdx=0x22=34。
rdx=输入-65+32,因此输入的第一个字符是67=‘C’。
若输入的第一个字符为A,则得到0x2390->what I lost
若输入的第一个字符为B,则得到0x2398->what am I to you
若输入的第一个字符为D,则得到0x23a8->Am I a joke,your knight,oryou brother?
根据下一句歌词所在的位置可以推断出相应的输入。
第三句歌词是What I lost... was a piece of your hair!在Ishould have just told you下方有四句歌词。What I lost是第二句,因此输入的第二个字符是B。
whatI lost的下一句歌词是Now it’s gone;goneforever,在第四句,因此输入的第三个字符是D。
依次类推,得到剩下的输入。
完整的输入为CBDABCADBCCABBABBABACBCCABDADBABABB
加上这个参数运行程序得到flag
参考的writeup:
http://sibears.ru/labs/TJCTF-2016-whatamitoyou/
Flag:
tql大佬
学习
付费了