일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 학교 개학 연기 4월
- 픽크루
- 불가피
- 폰폰테스트
- 김재석
- 리리남매
- 유튜버 김재석
- 금리인하
- 은혜의 강 교회
- 김영권 아내
- 뭉쳐야 찬다
- 임영규
- 해킹
- 홍혜걸
- 스콜피온킹
- libtins
- 미국 금리인하
- 성남 코로나 확진자
- 양적완화
- 이상형 만들기
- 스페인 코로나
- 최강욱
- 제넥신
- 성남은혜의강교회
- 고민정
- 이태원 클라쓰 15회 예고
- 김영권
- 킹덤 고근희
- 조희연
- 이지혜
- Today
- Total
Dork's port
FTZ Level13 Write-up(FTZ Level13 풀이) 본문
힌트를 보니 특이한 코드가 보이는군요!
i가 16진수 값 1234567로 초기화가 되어있고
문자를 입력 받은 후 i를 체크하여 값이 변했다면 프로그램을 종료시키는군요!
문제를 미뤄보아 buf의 스택 밑에 i가 위치하고 i의 값을 0x1234567로 변하지 않게 또는, 0x1234567로 초기화를 시켜주어야 겠군요!
오버플로우 위해서 값 입력은 필수적이니 변하지 않게 할 수는 없을 것 같습니다.
따라서 i의 주소에는 다시 0x1234567로 초기화를 시켜주도록 하죠! 저기 있는 if문을 우회하기 위해서요!
먼저 스택을 보기위해 gdb를 사용합니다.
gdb를 사용하기 위해 위 코드를 아래 명령어로 복사하여 디버깅 옵션을 주어 컴파일 해보죠!
$ cp hint tmp/attackme.c
$ cd tmp
$ gcc -g -o attackme attackme.c
그리고 gdb를 실행 시킨 후 어셈블리 명령어로 스택이 어떻게 변하는지 보도록하죠!
$ gdb attackme
(gdb) disass main
중요한 것은 i의 주소와 buf의 주소 입니다.
일일히 스택을 따라갈 필요없이 중요한 어셈블리 명령만 보면서 유추해 보도록 하죠!
소스코드 상에서 i는 0x1234567로 초기화 되어있습니다. 아래의 사진을 보면 0x1234567값을 특정 메모리 (ebp에서 fffffff4만큼 떨어진 주소)에 해당 값을 초기화 시키는 것으로 보아 i의 주소는 0xfffffff4(%ebp)인 것을 유추할 수 있습니다.
다음으로 buf의 주소를 찾아야하죠!
buf는 소스코드 상에서 strcpy에 사용되었으므로 인자로 사용되었을 것 입니다.
아래의 사진과 같이 strcpy의 함수를 부르기 전 eax의 값을 push해주게 되는데 eax는 그 이전 코드에서 0xfffffbe8(%ebp)의 주소를 대입하는 것으로 보아 buf의 주소는 0xfffffbe8(%ebp)인 것을 알 수 있습니다!
그러면 이제 buf에서 부터 i의 주소 직전까지만 채우고 i는 다시 0x1234567로 채워야하므로 buf에서 i까지의 스택의 차이가 얼마나 나는지 계산을 먼저 해야겠쬬?
i의 주소 (ff4) - buf의 주소(be8)을 해주면 차이가 나오겠군요!
i에서 빼주는 이유는 스택에 먼저 쌓여 아래(높은 주소)를 가지고 있으므로 i부터 빼주게 됩니다.
빼주면 차이는 바로바로 1036나네요!
그렇다면 buf에 1036만큼 채운후(이때 포인터의 주소는 i의 주소)그 후 값을 0x1234567로 채워주면 if문을 뛰어넘을 수 있을 것 같습니다!
우선 테스트를 위해서 1040이라는 큰 값(i의 값을 변경할만한 값)을 넣어 프로그램을 먼저 실행시켜 보겠습니다.
예상대로 if문이 실행되어 오류를 뿜뿜하네요.
그렇다면 계산대로 1036만큼 채운후 원래 i값으로 다시 초기화 시켜주면 어떻게 될까요?
이때 2자리씩 4번 즉, 4바이트 만큼 적어야 하므로 0x1234567의 값은 0x01234567로 적어주되 리틀 엔디안을 고려하여 적어주면 됩니다.
아래와 같이 적을 수 있겠네요.
그 후 RET를 찾기위해 값을 조금더 넣어보았습니다(0x12).
정상 실행이 되네요!
그럼 RET까지의 스택에서의 길이가 얼마나 차이나는지 보기 위하여 임의의 값을 넣어보니 12바이트 만큼 차이가 난다는 것을 알 수 있습니다!
그럼 이를이용해서 그 다음주소에 eggshell의 주소를 넣어주면 되겠네요!
eggshell 코드 및 설명은 이전 포스팅에서 설명을 자세하게 해두었으므로 생략하겠습니다.
2018/03/24 - [Hackerschool FTZ Write-up] - FTZ Level11 Write-up(FTZ Level11 풀이)
쉘이 정상적으로 실행되고 id를 입력해보니 level14입니다!
벌써 FTZ도 끝나가네요!
마지막을 향해 달려가봅시다!
'Hackerschool FTZ Write-up' 카테고리의 다른 글
FTZ Level15 Write-up(FTZ Level15 풀이) (0) | 2018.03.26 |
---|---|
FTZ Level14 Write-up(FTZ Level14 풀이) (0) | 2018.03.24 |
FTZ Level12 Write-up(FTZ Level12 풀이) (1) | 2018.03.24 |
FTZ Level11 Write-up(FTZ Level11 풀이) (0) | 2018.03.24 |
FTZ Level10 Write-up(FTZ Level10 풀이) (0) | 2018.03.23 |