解决了第一个问题后
来到phase_2
gdb bomb
disas phase_2
输入仍然是input 在 rdi中
然后开了40字节的缓冲区
接着把栈头地址丢给rsi
调用read_six_number 顾名思义但是我们还是看看
disas read_six_numbers
在read_six_numbsers中我们看到
考虑到sscanf 的第三个参数是我们的输入所以rsi 放入到rdx中
看下
x/s 0x4025c3
“%d %d %d %d %d %d”是sscanf的第二参数
作为sscanf的第二个参数esi接受了输入 并且最后判断是否是否大于 5
在phase_2中调用read_six_numbsers后打断点
b *0x400f0a
可以看到we are right
回到phase_2中
我们看到对于栈顶也就是第一个数必须要是0不然直接炸
然后跳转到52
一个int 4个字节所以这句是下一个数
然后跳到上面去把这个数的前一个数*2 与这个数比较不相等直接炸
最后打个断点看下rbp
在比较处打上断点
看到寄存器rbx 与 rbp的差值是16个字节算上第一个和这次的一共可以比较前6个整数
所以答案是
1 2 4 8 16 32