第一步用IDA打开,发现main函数里啥都没有,只有一条ret指令,在gdb中会直接退出,尝试./lab1-4输入flag,但是没有输入的入口,但是发现main函数第一行不是push rbp,而是ret,因为这条指令,使得无法继续,直接返回了。所以我们需要把这条语句改掉,通过和前面三个实验对比,发现main函数入口处二进制格式应该是55,而现在是c3。尝试在vim中打开文件,并修改,但是一直提示文件错误,此处也不知道为什么。咨询了学长,应该用ida中的patch进行修改,修改完以后就可以通过gdb调试了。
image.png
gdb调试.png
可以看到ret应该改为push rbp 记住此处的地址
用ida可以看到二进制main的值:
image.png
用ida查看前面文件的main第一个地址:
image.png
可以发现正常应该时55,所以我们修改c3为55,这里有一个小坑,我用vim修改的时候文件会出错,用ida修改就是可以了
image.png
image.png
然后需要将文件给覆盖了
image.png
现在就可以正常进入main函数了
image.png
第二步,通过ida中的结构和gdb的调试,发现有21个字符,需要进行21轮次,从0轮次到20轮次,输入的字符需要先和当前轮次异或,然后在和当然轮次相加,然后和输入的21个ascii码比较。所以,我们可以先用给出的十六进制,减去当前轮次,然后和轮次异或,就可以得出需要输入的字符
image.png
python代码:
store=[0x66,0x6e,0x65,0x67,0x83,0x7a,0x6d,0x7a,0x73,0x6a,0x5f,0x7d,0x6f,0x85,0x8a,0x5f,0x86,0x89,0x90,0x89,0x7d]
result=""
for i in range(0,21):
x=store[i]-i
y=x^i
result+=chr(y)
print(result)
结果:image.png