<Wargame & CTF>/Pwnable.xyz

[Pwnable.xyz] GrownUp

gosoeungduk 2019. 12. 29. 00:40
반응형

GrownUp

#pwnable.xyz #baby_fsb


오랜만에 pwnable.xyz 를 하였다.

몸풀기로 낮은 점수의 GrownUp 문제를 풀어보았다.

플래그는 바이너리에 내장되어있다고 한다.

바이너리 문자열을 검색해보면 진짜로 플래그 (물론 페이크 플래그)가 내장되어있다.

0x601080 이 주소를 기억하라. PIE가 적용되어있지 않아서 이 data영역의 주소는 서버에서도 동일하게 매핑되어있을 것이다.

바이너리 실행결과는 이렇다.

봐야할 주요부분은 main함수이다.

처음에는 setup 함수가 실행된다. setup 함수는 ...

data영역의 0x601160 부분에 %s\n 문자열을 넣는다. 후에 0x601160은 main함수의 printf의 서식문자로 이용된다.

그리고 y or N에 대한 응답을 read함수로 받아서 스택에 넣는다. 하지만 read하는 바이트수는 16바이트이며, 마지막에 직접 NULL값을 넣어주는 로직이 따로 있는 것을 알 수 있다.

심상치 않은 로직이라 조금 유념했지만 크게 크리티컬하진 않았다.

main의 마지막 부분은 malloc함수로 heap을 0x84만큼 할당받아서 0x80을 read하고 data영역인 usr에 strcpy후 printf 한다.

여기서는 쓸데없이 strcpy하는 부분이 미심쩍어 살펴보았다.

usr은 0x6010E0 에 위치하며, 0x601160과 0x80의 차이가 있다.

여기서 src에 malloc을 0x84만큼 해주는데 그렇게 되면 malloc된 heap영역은 전부 0으로 비워진 상태이다.

여기에 0x80만큼을 모두 채워 read하게 되면 strcpy시에 0x81만큼 src에서 usr영역으로 데이터가 카피되게 된다.

그러면 0x80 이후의 1바이트는 0x601160의 한 바이트를 침범하게 되고, setup함수를 다시 참고하면 0x601160안의 0x601168주소는 NULL 값에 의해 0x601100이 되어버릴 것이다.

0x601100은 usr 주소인 0x6010E0 에서 0x20만큼 떨어진 곳이며 여기에 %s\n 대신 다른 서식문자를 넣어 마지막 printf를 조작할 수 있다.

우선 fsb 취약점으로, 스택영역의 데이터들을 볼 수 있다.

이런 식으로 8번째 %p 서식문자에서 맨 처음 read에 입력한 yyyyyyyy 에 대한 데이터가 보임을 알 수 있다. 이를 이용하여 payload를 짜보자.

from pwn import *
#s=process("./GrownUpRedist")
s=remote("svc.pwnable.xyz",30004)
s.recvuntil("Are you 18 years or older? [y/N]: ")
s.send("yyyyyyyy".encode()+p64(0x601080))
s.recvuntil("Name: ")
s.send("a"*32+"%p %p %p %p %p %p %p %p %s "+"a"*69)
s.interactive()


result

로컬에서 실행해본 결과이다. 이런 식으로 서버에서도 플래그를 구할 수 있다.

.
.
.

Contact : a42873410@gmail.com

반응형

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

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