GgangCTF는 여러 해킹 기법들을 공부할 수 있는 워게임 사이트로 주소는
http://123.143.18.212:4000/입니다.
저희 학교 과(동아리)에서 운영중인 사이트이므로 많은 분들이 방문해서 문제 풀어보시길 바랍니다~!!
정말 재밌는 문제들 많습니다 :)
오늘 풀어볼 문제는 Ggang CTF에 있는 포너블 분야의 문제로
bounceball 문제입니다.
문제 풀이 전 필요한 개념
사실, 처음 이 문제를 접했을 때, 그 전 문제가 Canary 우회 문제라서 그런지
Canary 문제인 줄 알고 어떻게 풀지 고민을 많이 했습니다.
하지만, 차근 차근 코드를 읽어보면 그렇지 않다는 것을 알 수 있습니다.
이 문제를 통해서 read 함수에 대해 자세히 알아갈 수 있습니다.
read 함수는 ssize_t read (int fd, void *buf, size_t nbytes)형태로,
int fd: 데이터를 전송해줄 대상을 가리키는 파일 디스크립터
void *buf: 파일을 읽어 들일 버퍼
size_t nbytes: 읽어 들일 최대 바이트 수
여기서 핵심
※반환 값은 size_t nbytes로 정상적으로 실행되었다면 읽어들인 바이트 수를, 실패했다면 -1을 반환합니다.
자, 그러면 문제 풀이를 시작하겠습니다.
eax 레지스터를 이해했냐는 질문과 실행파일이 주어집니다.
우선, 실행파일을 다운 받아서 보안 기법을 확인합시다.
Canary와 NX-bit 보호 기법이 적용된 것을 알 수 있습니다.
코드 분석
그러면, IDA Pro로 열어서 분석해봅시다.
menu 함수를 실행하는데
meun 함수는다음 내용을 출력합니다.
그래서 s1에 입력을 받아서 Mercury, Venus, Earth, Mars를 입력하면,
해당 행성에 도착했다고 알려주고 2초 후 죽었다는 메세지와 함께 종료됩니다.
예외로 SecretPlanet을 입력하면, read 함수로 0x1e 만큼 입력받고
read 함수의 반환 값이 저장된 v3에 4198896을 더한 값의 주소를 참조하며 종료됩니다.
어떻게 풀어야 할 지 고민하며 함수 목록을 보니 감사하게도 도움이 될 함수가 존재합니다.
system("/bin/sh")가 실행되는 BigBang 함수가 존재합니다.
이걸 이용해서 문제를 풀어야 할 것 같습니다.
페이로드 구상
아까 맨 처음에
문제에서 eax 레지스터 이해했냐고 물어봤었는데
64비트임을 고려하면, rax를 의미할 것입니다.
그리고 그 rax는 v3변수입니다.
실제 어셈 코드를 보면 다음과 같습니다.
즉, rax에 0x4011f0 (4198896)을 더하고 해당 주소를 call 합니다.
이걸 활용해보면, v3에 4198896 (0x4011f0)더한 값의 주소를 참조하는데,
더해서 만들어진 주소가 BigBang 주소와 동일하면 쉘을 딸 수 있을겁니다.
v3에는 read 함수의 반환 값이 들어가는데,
read 함수가 성공적으로 실행된 경우 읽어 들인 바이트 수가 v3에 저장됩니다.
BigBang 함수의 주소는 0x401204 이므로
v3 + 0x4011f0 = 0x401204 (BigBang) 이 되도록 하는 v3 값을 만들어주면 됩니다.
v3 = 0x401204 - 0x4011f0 = 0x14 = 20바이트
즉, read 함수에 20바이트를 넘겨주면 알아서 BigBang 함수가 실행되어 쉘을 따게 되는 것입니다.
이를 바탕으로 페이로드를 작성하면 다음과 같습니다.
from pwn import*
#context.log_level = "debug"
p = remote("123.143.18.212", 50004)
e = ELF("./bounceball")
bigbang = 0x401204
offset = bigbang - 0x4011f0 # 20 바이트 임
p.sendline("SecretPlanet") # secretplanet 입력하고
p.sendline("a"*int(offset)) # 20 바이트 아무 값이나 넣기
p.interactive()
굉장히 간단합니다. SecretPlanet 입력하고 20바이트 아무 값이나 넣어주는 코드입니다.
(페이로드를 작성하지 않고 그냥 바로 해결할 수 있는 문제이긴 합니다.)
이를 실행시키면 다음과 같이 플래그를 얻을 수 있습니다.
처음 풀어보는 종류의 문제라서 굉장히 신선하게 다가왔습니다.
read 함수 반환 값에 대해서 알아볼 수 있는 시간이었습니다.
'Wargame > Pwnable' 카테고리의 다른 글
[포너블] 드림핵(Dreamhack) hook 문제 풀이 | hook overwrite (0) | 2021.02.01 |
---|---|
[포너블] Ggang CTF korean_wizard 문제 풀이 | magic gadget, One-gadget 사용, main으로 돌아가기 (4) | 2021.01.29 |
[포너블] Ggang CTF rpg 문제 풀이 | Canary 우회, 64비트 문제 (0) | 2021.01.28 |
[포너블] HackCTF RTC 문제 풀이 | RTC 기법 return to csu (0) | 2021.01.27 |
[포너블] Ggang CTF babyrop 문제 풀이 | 64비트 ROP, libc가 주어지지 않았을 때 (2) | 2021.01.26 |