일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- #IntelManual
- Network
- >
- 오버워치 세이버메트릭스
- Find
- #Best of the Best #OS #MINT64 #Sqix
- BEST of the BEST
- command
- libpcap
- 오버워치
- libtins
- 인터럽트
- #Qt Creator
- #
- Overwatch League SaberMetrics
- FTZ 레벨2
- vi
- ftz
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- vi 외부 명령어
- #MINT64 #Sqix
- linux
- vim
- KASAN
- C++11
- Sqix
- Today
- Total
Sqix
FTZ Level15 본문
==============================
hint
#include <stdio.h>
main()
{
int crap;
int *check;
char buf[20];
fgets(buf, 45, stdin);
if(*check == 0xdeadbeef)
{
setreuid(3096,3096);
system("/bin/sh");
}
}
==============================
이번엔 포인터로 변수가 지정되어 있습니다. 이전처럼 buf랑 dummy를 덮고 이 부분을 0xdeadbeef로 만드는 것은 할 수 없을 것 같습니다.
환경 변수에 0xdeadbeef를 등록하여 이 환경 변수의 주소를 가져오도록 하던지, 아니면 main함수에서 0xdeadbeef가 저장된 주소 혹은 오프셋을 구해서
해당 주소의 값을 참조하도록 하면 될 듯 합니다.
스택을 확인해본 결과 이전 문제와 동일하게 구성되어 있습니다.
일단 main에서 0xdeadbeef가 있나 먼저 찾아보았습니다. 0x80483e4 부분에 존재하는 것을 확인할 수 있었습니다.
저는 따라서 0x41로 40을, 그리고 0x80483e4로 check가 참조할 주소를 입력해 넣으려고 합니다.
그런데 $ (python -c 'print "A" * 40 + "\xe4\x83\x04\x08"'; cat) | ./attackme 명령어를 넣었더니 tmp에서는 쉘을 획득하는데 성공하지만,
원래 있던 level15 폴더에선 성공하지 못하였습니다.
그 이유는 경로의 차이 때문에 주소공간이 바뀌어서 그런 것입니다. 해당 방법을 찾기 위해 고민하던 중 gdb가 level15 폴더의 attackme에도 붙는 것을 알아냈습니다.
그래서 그에 맞추어서 입력을 해 넣었습니다.
성공!
'Wargame > FTZ' 카테고리의 다른 글
FTZ Level17 (0) | 2018.07.20 |
---|---|
FTZ Level16 (0) | 2018.07.20 |
FTZ Level14 (0) | 2018.07.10 |
FTZ Level13 (0) | 2018.06.29 |
FTZ Level12 (0) | 2018.06.29 |