일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ftz
- Network
- KASAN
- Sqix
- vim
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- linux
- libtins
- command
- libpcap
- >
- #Best of the Best #OS #MINT64 #Sqix
- FTZ 레벨2
- 오버워치
- Find
- #IntelManual
- 오버워치 세이버메트릭스
- vi
- BEST of the BEST
- #MINT64 #Sqix
- #
- #Qt Creator
- vi 외부 명령어
- C++11
- 인터럽트
- Overwatch League SaberMetrics
- Today
- Total
Sqix
FTZ Level18 본문
소스코드가 꽤 긴데, 여기서는 fd를 이용해서 input을 받아왔습니다.
크게 어려울 건 없네요. fd_set 구조체를 FD_ZERO 매크로로 초기화하고 FD_SET을 이용해서 STDIN_FILENO(0) 소켓번호를 fds에 추가합니다.
select 함수를 이용해서 fds를 감시하도록 하였고(FD_SETSIZE, &fds만 argument로 있으므로, io stream 다중화라기보단 fds 감시 목적인 것 같습니다)
FD_ISSET(fileno(stdin),&fds)을 통해서 fds가 표준입력으로 정의된 경우에만 read함수를 이용해서 사용자 입력을 받도록 하였습니다.
즉, exploit을 짤 때 C 소스에 대해서 크게 고민할 필요 없이 표준입력을 넣으면 되는 상황입니다.
결국 untrusted input에 영향을 받는 경우는 switch문 안의 case, default뿐이라는 결론이 나왔습니다.
다시 원점으로 돌아와서 shellout 함수를 실행시키려면 check를 0xdeadbeef로 만들어야 합니다.
변수들을 보면 100bytes의 string, check, x, count 각각 4 bytes씩 12 bytes, fd_set 구조체 32bytes로 총 144 bytes를 생성합니다.
string - check - x - count - fd_set 순서대로 스택에 들어가겠네요.
입력은 x에 들어오고, 우리는 check를 덮어야 합니다. 여기어 untrust input에 영향을 받는 것은 count와 그 count에 영향을 받는 string이죠.
일단 어셈블리를 정확히 읽어서 dummy의 위치를 파악해야 합니다.
0x0804855c <main+12>: mov DWORD PTR [ebp-108],0x0
0x08048563 <main+19>: mov DWORD PTR [ebp-112],0x0
0x080485ab <main+91>: cmp DWORD PTR [ebp-104],0xdeadbeef
'Wargame > FTZ' 카테고리의 다른 글
FTZ All Clear! (0) | 2018.07.21 |
---|---|
FTZ Level19 (0) | 2018.07.21 |
FTZ Level17 (0) | 2018.07.20 |
FTZ Level16 (0) | 2018.07.20 |
FTZ Level15 (0) | 2018.07.10 |