题目大意:输入四个key,解出密码。

提示:密码开头是'From:'

解答

观察代码发现process都是修改内存中某一位置的值

start是dummy的第一个字节的值,stride是dummy的第二个字节的值

很容易想到process_keys12是用来修改dummy的

发现key1和dummy刚好相差四个字节,所以key1=1

考虑start和stride怎么求

e_m1无非就是从start+1开始连续赋值stride-1个,再跳过1个,再赋值stride-1个一直到有个'\0'为止

因为密码开头是'From'所以第start+1是'F',start+2或start+3是'r',然后我们考虑找出所有的'F'和'r'

发现start和stride一共有四种可能

试一下发现start=9,stride=3,dummy=key2=777

考虑key3和key4(不同电脑的key3可能略有差异)

很容易想到key3key4是想让msg1的第一位字符变成0,也就是data开始的第start+1=10个字节变成0

和Pro12很像,只是这里的&key3取的是函数中指针变量key3的地址

注意区分&key3,key3,*key3

0x4030ca-0x22fe00=1913546=4*478386+2

很容易想到key3=478386,key4的第三个字节为-'F'

也就是key3的值为地址的差除以4再向下取整(比如-10/4=-3)

所以key4=-4587520(当然用补码也可以,此时key4=4290379776)

yeah!


告别纷扰,去寻找生活的宝藏。