[Dreamhack] Platform 9½
[Dreamhack] Platform 9½
문제 링크
https://dreamhack.io/wargame/challenges/2103
문제 설명
You can board Dreamhack Express from platform 9½!
문제 분석
스택이 다음과 같은 구조를 가진다.
1
2
3
4
5
6
7
// ... some local variables ...
char *s[10];
char buf[128];
char dummy[16];
__int64 stackcanary;
__int64 sfp;
__int64 ret_addr;
위와 같은 스택에 다음과 같은 행위를 할 수 있다.
1
2
3
4
5
6
7
8
9
10
int index;
// 1(view)
scanf("%d", &index);
puts(s[index-1]);
// 2(edit)
scanf("%d", &index);
read(0, buf, size); // size는 전역 변수, 기본 값 0x80
strcpy(s[index-1], buf);
- 두 행위 모두 인덱스에 대한 검사가 없으므로, OOB가 발생할 수 있고, 임의 주소 쓰기와 읽기가 가능하다.
- 스택 상에 존재하는 값들을 활용하여 libc base와 PIE base, stack canary를 확보할 수 있다.
가능한 익스플로잇 방법은 여러가지가 있지만, 나는 아래 방법을 활용하였다. (ROP)
- buf[8] ~ buf[15] 위치에
main 함수의 반환 주소
를 작성하고, 12번째 인덱스를 edit하여pop_rdi 가젯
으로 덮어쓴다. - buf[8] ~ buf[15] 위치에
main 함수의 반환 주소+8
를 작성하고, 12번째 인덱스를 edit하여"/bin/sh" 주소
으로 덮어쓴다. - …
새롭게 알게된 점
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.