首页
社区
课程
招聘
6
[原创][writeup]CTFHUB-ret2dl_resolve
发表于: 2023-3-13 10:00 18741

[原创][writeup]CTFHUB-ret2dl_resolve

2023-3-13 10:00
18741

目录

目录

笔记

在pwndbg中查看结构体定义

pwndbg> ptype Struct


程序分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buf[256]; // [rsp+0h] [rbp-100h] BYREF
 
  read(0, buf, 0x1000uLL);
  return 0;
}
 
/*
Arch:     amd64-64-little
RELRO:    Partial RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      No PIE (0x3ff000)
RUNPATH:  b'/root/tools/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/'
*/

超大的栈溢出,保护只开了NXPartial RELRO

 

ELF中没有后门函数,可利用字符串,可用的函数也只有read

>>>elf.plt

{'read': 4195312}

>>>elf.got

{'__libc_startmain': 6295536, '\_gmon_start__': 6295544, 'read': 6295576}


利用分析

由于程序中提供的函数符号有限,所以无法正常泄露出libc基址,需要ret2dl-resolve泄露libc函数地址,并使用其和system函数的偏移计算得到system函数

延迟绑定技术

为避免在运行程序时加载过多的动态链接导致卡顿,操作系统实现了延迟绑定(Lazy Binding)的技术,只有在函数首次调用时才进行绑定,

 

当程序首次 call func@plt,将执行以下操作,此处拿read@plt作为示例

1
.text:0000000000400506               call    _read
1
2
3
4
5
_read proc near
.plt:00000000004003F0                jmp     cs:off_601018
_read endp
.plt:00000000004003F6                push    0
.plt:00000000004003FB                jmp     plt_0

当程序每次call _read时,都将跳转至0x4003F0执行jmp语句,在首次调用时,cs:off_601018指向read@plt的下一条指令,即0x4003F6以进行绑定操作,在第一次调用后,cs:off_601018将指向read的真正地址

1
2
3
4
plt_0 proc near                        
.plt:00000000004003E0             push    cs:linkMap
.plt:00000000004003E6             jmp     cs:_dl_runtime_resolve
plt_0 endp

push cs:linkMap后跳转至_dl_runtime_resolve函数,加上read@plt中push 0,此处即调用_dl_runtime_resolve(linkMap,0)


_dl_runtime_resolve_xsavec函数分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
;↓↓↓↓↓↓↓↓↓↓保存调用参数环境↓↓↓↓↓↓↓↓↓↓
0x00007ffff7c17750 <+0>:    push   rbx
0x00007ffff7c17751 <+1>:    mov    rbx,rsp
0x00007ffff7c17754 <+4>:    and    rsp,0xffffffffffffffc0
0x00007ffff7c17758 <+8>:    sub    rsp,QWORD PTR [rip+0x2100a9]        # 0x7ffff7e27808 <_rtld_global_ro+168>
0x00007ffff7c1775f <+15>:    mov    QWORD PTR [rsp],rax
0x00007ffff7c17763 <+19>:    mov    QWORD PTR [rsp+0x8],rcx
0x00007ffff7c17768 <+24>:    mov    QWORD PTR [rsp+0x10],rdx
0x00007ffff7c1776d <+29>:    mov    QWORD PTR [rsp+0x18],rsi
0x00007ffff7c17772 <+34>:    mov    QWORD PTR [rsp+0x20],rdi
0x00007ffff7c17777 <+39>:    mov    QWORD PTR [rsp+0x28],r8
0x00007ffff7c1777c <+44>:    mov    QWORD PTR [rsp+0x30],r9
0x00007ffff7c17781 <+49>:    mov    eax,0xee
0x00007ffff7c17786 <+54>:    xor    edx,edx
0x00007ffff7c17788 <+56>:    mov    QWORD PTR [rsp+0x250],rdx
0x00007ffff7c17790 <+64>:    mov    QWORD PTR [rsp+0x258],rdx
0x00007ffff7c17798 <+72>:    mov    QWORD PTR [rsp+0x260],rdx
0x00007ffff7c177a0 <+80>:    mov    QWORD PTR [rsp+0x268],rdx
0x00007ffff7c177a8 <+88>:    mov    QWORD PTR [rsp+0x270],rdx
0x00007ffff7c177b0 <+96>:    mov    QWORD PTR [rsp+0x278],rdx
0x00007ffff7c177b8 <+104>:    xsavec [rsp+0x40]
0x00007ffff7c177bd <+109>:    mov    rsi,QWORD PTR [rbx+0x10]
0x00007ffff7c177c1 <+113>:    mov    rdi,QWORD PTR [rbx+0x8]
;↑↑↑↑↑↑↑↑↑↑保存调用参数环境↑↑↑↑↑↑↑↑↑↑
0x00007ffff7c177c5 <+117>:    call   0x7ffff7c0fdf0 <_dl_fixup>;真正的绑定查询函数
0x00007ffff7c177ca <+122>:    mov    r11,rax ;将结果保存至R11
;↓↓↓↓↓↓↓↓↓↓还原调用参数环境↓↓↓↓↓↓↓↓↓↓
0x00007ffff7c177cd <+125>:    mov    eax,0xee
0x00007ffff7c177d2 <+130>:    xor    edx,edx
0x00007ffff7c177d4 <+132>:    xrstor [rsp+0x40]
0x00007ffff7c177d9 <+137>:    mov    r9,QWORD PTR [rsp+0x30]
0x00007ffff7c177de <+142>:    mov    r8,QWORD PTR [rsp+0x28]
0x00007ffff7c177e3 <+147>:    mov    rdi,QWORD PTR [rsp+0x20]
0x00007ffff7c177e8 <+152>:    mov    rsi,QWORD PTR [rsp+0x18]
0x00007ffff7c177ed <+157>:    mov    rdx,QWORD PTR [rsp+0x10]
0x00007ffff7c177f2 <+162>:    mov    rcx,QWORD PTR [rsp+0x8]
0x00007ffff7c177f7 <+167>:    mov    rax,QWORD PTR [rsp]
0x00007ffff7c177fb <+171>:    mov    rsp,rbx
0x00007ffff7c177fe <+174>:    mov    rbx,QWORD PTR [rsp]
0x00007ffff7c17802 <+178>:    add    rsp,0x18
;↑↑↑↑↑↑↑↑↑↑还原调用参数环境↑↑↑↑↑↑↑↑↑↑
0x00007ffff7c17806 <+182>:    bnd jmp r11 ;跳转至原目标函数

可以看到_dl_runtime_resolve_xsavec函数只负责

1.保存原目标函数(read)的参数环境

2.调用_dl_fixup查询并绑定read的真正地址至linkMap中指定的重定位地址

3.还原原目标函数(read)的参数环境

4.跳转至_dl_fixup的查询结果

 

[注意]看雪招聘,专注安全领域的专业人才平台!

上传的附件:
收藏
免费 6
支持
分享
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2023-12-25 00:19
StardyGod
为你点赞~
2023-7-20 19:14
一半人生
为你点赞~
2023-6-4 19:03
Aira
为你点赞~
2023-5-8 01:42
_重黎
为你点赞~
2023-4-1 12:50
LeaMov
为你点赞~
2023-3-13 17:06
最新回复 (4)
雪    币: 6030
活跃值: (3850)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
2
b = 1<<64 - a
2023-3-14 22:29
0
雪    币: 1878
活跃值: (3413)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
3
我超啊 b = 1
感谢指点
2023-3-15 10:48
0
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
师傅能帮忙看一下这个帖子的问题吗?https://bbs.kanxue.com/thread-277482.htm 非常感谢。
2023-6-4 17:29
0
雪    币: 1878
活跃值: (3413)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
5
zulkar_Lab 师傅能帮忙看一下这个帖子的问题吗?https://bbs.kanxue.com/thread-277482.htm 非常感谢。
报错大概是说你传入的字符串执行了一个system("d")的意思,我翻了一下我的wp,我用的是onegadget打的,然后我也试了一下用system打,用libc.search(b"/bin/sh")找的sh字符串无法使用,但是自己构造read往bss里写入/bin/sh再调用system是可以正常打通的
2023-6-5 11:24
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册