일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- command
- 오버워치
- KASAN
- C++11
- Network
- #Qt Creator
- #IntelManual
- #Best of the Best #OS #MINT64 #Sqix
- vim
- #
- Overwatch League SaberMetrics
- vi 외부 명령어
- libpcap
- libtins
- Sqix
- >
- #MINT64 #Sqix
- BEST of the BEST
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- Find
- 오버워치 세이버메트릭스
- ftz
- 인터럽트
- FTZ 레벨2
- vi
- linux
- Today
- Total
Sqix
FTZ Level16 본문
프로그램의 구조 상 void (*call)() 함수 포인터가 가리키는 함수의 주소를 shell 함수로 변경하여 shell 함수를 실행시켜야 하는 것 같습니다.
우선 어셈블리를 먼저 확인해보겠습니다.
56바이트의 스택을 확보하고 fgets로 사용자에게서 입력을 받아온 뒤, *call이 가리키는 함수를 실행시킵니다.
여기서 shell 함수의 주소를 찾고, stack에서 *call의 위치(ebp에서의 거리)를 찾아 그 전까지는 덮어버리고 *call을 다른 함수로 바꿔준다면 문제가 해결될 것 같습니다.
여기에서 보면 printit 함수의 주소는 0x8048500, shell함수의 주소는 0x80484d0입니다.
어셈블리를 다시 보면, movl $0x8048500, 0xfffffff0(%ebp)라는 명령어가 있는데 이는 ebp-16의 위치에 printit 함수의 주소를 넣으라는 명령어입니다.
사실 스택을 구조화해 보고, gcc 3.2.2 버전에 따른 더미값을 알 수 있다면 거리 파악은 쉽습니다.
http://www.hackerschool.org/HS_Boards/data/Lib_system/dummy3.txt 이 글에 따르면, 일반 변수는 8byte, buf은 크기에 따른 dummy를 넣습니다.
즉, 스택의 구조는 [ buf 20 ] [ dummy 20 ] [ call 4 ] [ dummy 4 ] [ crap 4 ] [ dummy 4 ] [ SFP 4 ] [ RET 4 ] 로 구성되어 있습니다.
따라서 우리는 40bytes의 A와 "\xd0\x84\x04\x08"을 fgets에 집어넣어 buffer overflow를 일으키면 shell 함수를 호출할 수 있습니다.
성공
'Wargame > FTZ' 카테고리의 다른 글
FTZ Level18 (0) | 2018.07.20 |
---|---|
FTZ Level17 (0) | 2018.07.20 |
FTZ Level15 (0) | 2018.07.10 |
FTZ Level14 (0) | 2018.07.10 |
FTZ Level13 (0) | 2018.06.29 |