菜鸡比赛结束后做做这道很简单的re
首先上ida分析
这里发现main函数无法显示...然后从画红线的部分可以看到输入的字符串要跟0xe比较,然后可能会跳到loc_400698这个函数,这个函数是输出wrong!的,所以我们知道了输入的字符串长度为0xe即14。由于ida看不到关键的main函数,只能gdb下继续分析
到这里发现调用了rdx,应该是关键的函数,于是步入进去分析
一进去发现程序往栈里面存放了刚好14个字符,虽然不知道用来干嘛的,但是感觉跟flag有关系,因为都是14个字符
发现程序会进行14次循环,每次循环会将输入的字符串与0x1,0x2...0xe进行xor操作,并把异或后的字符从exd放到PTR[rax]中,最后又将PTR[rax]的值给edx,而dl是edx的低八位寄存器,相当于将异或后的值与最开始存储的值进行比较,于是flag便直接可以用脚本逆向得到
cipher=[0x66,0x6d,0x63,0x64,0x7f,0x6b,0x37,0x64,0x3b,0x56,0x60,0x3b,0x6e,0x70]
flag=""
for i in range(0x0,0xe):
#print i
flag+=chr(cipher[i]^i)
print flag
#flag{n1c3_j0b}
感觉这题虽然比较基础,但是考察的知识还是有的,提升了自己对汇编代码的认识以及逆向思维