일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- >
- #
- libpcap
- #Best of the Best #OS #MINT64 #Sqix
- FTZ 레벨2
- 오버워치 세이버메트릭스
- #Qt Creator
- libtins
- vim
- 오버워치
- command
- BEST of the BEST
- 인터럽트
- #MINT64 #Sqix
- Overwatch League SaberMetrics
- Sqix
- C++11
- Network
- KASAN
- #IntelManual
- vi
- ftz
- vi 외부 명령어
- linux
- Find
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- Today
- Total
Sqix
FTZ Level14 본문
====================================================
hint
레벨 14 이후로는 mainsource 문제를 그대로 가져왔습니다.
버퍼 오버플로우, 포맷스트링을 학습하는 데는 이 문제들이
가장 효과가 좋습니다.
#include <stdio.h>
#include <unistd.h>
main()
{
int crap;
int check;
char buf[20];
fgets(buf, 45, stdin);
if(check == 0xdeadbeef)
{
setreuid(3095,3095);
system("/bin/sh");
}
}
====================================================
마찬가지로 소스코드를 복사하여 tmp 디렉토리에 붙여넣고 컴파일을 하여 gdb에 올려봤습니다.
0x38, 즉 56bytes의 스택공간을 확보하여 놓습니다. 이 문제는 check 변수의 값을 0xdeadbeef로 만들어야 하기 때문에 check 변수의 위치를 파악하는 것이 중요하죠.
따라서 stack을 보면서 각 지역변수의 위치를 제대로 파악해야 할 것입니다.
여기서 드래그한 부분만큼이 확보된 56바이트 영역 + SFP입니다. A를 20개 넣어서 buf가 처음 20bytes를 차지한다는 것을 알아내었습니다.
또한, if 부분에서 check 부분과 비교할 때, 해당 위치를 알아내어 여기에 0xdeadbeef를 bof를 통해 넣어 줄 수 있습니다.
이로써 check 지역변수의 위치를 알아냈습니다. [ buf (20) ] - [ dummy (20) ] - [ check (4) ] - [ crap (4) ] - [ dummy (8) ] - [ SFP (4) ] - [ RET (4) ] 인 듯 합니다.
그럼 buf~dummy를 A로 덮고, check를 0xdeadbeef로 덮어준다면 if절을 패스할 수 있겠네요.
python code를 짜서 작동시켜 보겠습니다.
성공!
'Wargame > FTZ' 카테고리의 다른 글
FTZ Level16 (0) | 2018.07.20 |
---|---|
FTZ Level15 (0) | 2018.07.10 |
FTZ Level13 (0) | 2018.06.29 |
FTZ Level12 (0) | 2018.06.29 |
FTZ Level11 (0) | 2018.06.18 |