티스토리 뷰
Hackerschool FTZ의 Level 11 풀이입니다.
버퍼 오버플로우 기법에 대해서 공부를 한 뒤 풀었습니다.
attackme 파일의 소스코드로 보입니다.
strcpy 함수에서 문자열 길이 검사를 하지 않아서 오버플로우 취약점이 발생합니다.
printf 함수에서 포맷 스트링 버그 취약점도 있네요.
이번에는 버퍼 오버플로우 취약점을 이용해서 풀어보겠습니다.
attackme를 실행시키니 입력한 숫자를 다시 똑같이 출력해줍니다.
gdb를 사용해서 분석해보겠습니다.
0x08048473과 0x08048479에서 264와 8, 총 272를 빼주고 있습니다.
메모리 구조는 다음과 같을 것입니다.
[Buffer(256)][dummy(8)][SFP(4)][RET(4)]
그렇다면 공겨코드는 25바이트 쉘코드를 사용할 것이기에,
[NOP(243)][쉘코드(25)][RET(4)] or [NOP(100)][쉘코드(25)][NOP(143)][RET(4)]
이렇게 하면 될 것입니다.
NOP을 넣어주는 것을 NOP Sled라고 하는데,
NOP Sled를 사용하는 이유는 바로 쉘코드를 올려주면 항상 쉘코드의 시작주소에서 시작한다는 보장이 없기 때문입니다.
프로그램이 실행되면서 아무 곳이나 참조하더라도 NOP을 많이 넣어주면 쭉 미끄러지다가 쉘코드가 실행됩니다.
RET를 구하려고 main+53에 BP를 걸고 저렇게 입력했는데 "Couldn't get registers: Operation not permitted."이란 에러가 뜨네요.
에러가 나타나는 이유는 attackme 파일에 SetUID가 걸려있기 때문입니다.
그러니 cp 명령어를 이용하여 attackme 파일을 다른 파일로 복사하고 복사한 파일을 대상으로 위와 같이 해보겠습니다.
그랬더니 무사히 잘 됩니다.
이제 esp 스택을 확인해보겠습니다.
0xbffff4b0부터 NOP가 저장되고 있습니다.
이제 버퍼 오버플로우 공격을 시도해보겠습니다.
그런데 Segmentation fault가 나타납니다.
그 이유는 ASLR 기법이 적용되어있기 때문입니다.
ASLR 기법은 랜덤 스택으로, 스택의 주소가 일정하지 않고 계속 변하게 하는 기법입니다.
해결법은 계속 반복해서 payload를 넣어주면..
쉘을 얻었습니다!
Password : it is like this
'Pwnable > Hackerschool' 카테고리의 다른 글
[Hackerschool FTZ] Level 13 풀이 (0) | 2018.10.02 |
---|---|
[Hackerschool FTZ] Level 12 풀이 (0) | 2018.05.09 |
[Hackerschool FTZ] Level 10 풀이 (0) | 2018.03.29 |
[Hackerschool FTZ] Level 9 풀이 (0) | 2018.03.29 |
[Hackerschool FTZ] Level 8 풀이 (0) | 2018.03.28 |
- Total
- Today
- Yesterday
- Reversing
- 멘토링
- Level 02
- wargame
- pwnable
- Unity
- c++
- Advance RCE
- reversing.kr
- ftz
- Level 01
- hackerschool
- 안드로이드 멘토링
- Level 04
- Android
- 안드로이드
- Level 06
- CodeEngn
- 17th HackingCamp CTF
- Level 05
- Basic RCE
- 풀이
- C#
- Write-up
- 유니티
- HackingCamp
- Programming
- xcz.kr
- Level 03
- unity2d
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |