<Wargame & CTF>/Pwnable.xyz

[Pwnable.xyz] UAF

gosoeungduk 2019. 12. 30. 03:42
반응형

UAF

#pwnable.xyz #not UAF #overwrite #heap


배점에 비해 쉬웠던 문제.

핵심만 언급하려한다.

결론적으로 본 문제는 UAF를 이용하지 않아도 된다. UAF로 풀이하는 루트도 있을런지는 모르겠지만 필자는 그냥 overwrite를 이용해서 문제를 풀었다.

바이너리의 기능은 총 5가지이다.

게임을 시작하거나, 저장하거나, 지우거나, 게임이름을 출력하거나, 게임 이름을 수정하거나...

여기서 게임은 단순히 두 숫자를 받아서 xor한 값을 특정 heap영역에 저장하는 행동을 한다.

이 문제의 목표는 win 함수를 실행 시키는 것 같다.

우선 IDA로 보면 바이너리 실행직후, initialize_game 함수를 통해 특정 heap영역과 data영역을 구성한다.

구조는 대략 이러하다.

Name은 맨처음에 입력하거나 save_game 함수 실행시 127바이트까지 입력가능하다. 마지막은 NULL값을 위한 1바이트이다.

cur 전역변수는 save_game을 할 때마다 새 heap영역 주소로 교체된다.

그리고 1번 play_game에서는 cur 변수의 맨 마지막에 있는 calc 함수를 실행시키게 된다.

여기서 필자는 생판 처음보는 함수를 보게되는데...

strchrnul 함수이다. strchr에 추가적인 기능이 들어있는 함수이다. glibc 기반 함수인가보다.
아래 링크를 참고하자.
About strchr in linux

여기서 우리가 눈여겨 봐야할 것은 원하는 문자를 못찾았을 시에, 맨 처음 만나는 NULL에 대한 포인터 값을 리턴한다는 점이다.

아래는 cur 전역변수에 들어있는 heap영역의 모습이다. 필자는 127바이트를 채우고 확인해보았다.

보다시피 128바이트 직후에 xor값들을 저장할 다른 heap영역이 있고, 4바이트 뒤에 calc함수에 대한 주소가 있다.

그리고 그 사이사이에 5개의 null이 들어가있다.

여기서 머리를 잘 써보면, 우리는 play_game 시에 calc 함수대신 다른 함수를 실행시킬 수 있다.

단서를 정리해보자.

1. edit_character 함수는 원하는 문자 1개를 바꾸고싶은 다른 문자 1개로 바꿀 수 있다.
2. strchrnul 함수는 찾는 문자가 없을 시, 맨 처음 만나는 null문자의 포인터를 리턴한다
3. edit_character 함수에는 2번에 대해서도 문자를 추가할 수 있는 부가 예외처리를 해놨다

만약 null 값을 다 채운다면 우리는 calc 함수 주소까지 도달하여 win함수 주소로 바꿔버릴 수 있는 것이다!!


결과

한 번 풀어보는 것도 나쁘지않을 것이다. write up은 따로 첨부하지 않겠다 :)

.
.
.
.
contact : a42873410@gmail.com

반응형

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

[Pwnable.xyz] note  (0) 2020.07.31
[Pwnable.xyz] Game  (0) 2020.05.31
[Pwnable.xyz] GrownUp  (0) 2019.12.29
[Pwnable.xyz]add, misalignment  (0) 2019.02.03
[Pwnable.xyz]sub  (0) 2019.01.06