FTZ level 18
hint
while문 안의 내용을 무한반복한다.
switch문에서 string에 데이터가 저장되면서 count값이 변하는데 100이상이면 what are you trying to do?를출력
check에 0xdeadbeef가 들어있으면 shellout함수 실행
FD_ZERO(&fds);부터 if(FD_ISSET(fileno(stdin),&fds))까지 키보드로 입력을 받아 입력버퍼에 저장하는 과정
read(fileno(stdin),&x,1); 입력버퍼에서 1byte를 읽어 &x에 저장하고 데이터에서 1byte만큼 옮겨 간다. while문 반복이 되면서 다음 1byte를 입력버퍼에서 읽어 &x에 저장하여 조건에 맞는 switch문이 실행
x값이 0x08 이면 count 1감소
우선 gdb로 메모리를 확인해보면
LOW | count | x | check | string[100byte] | SFP | RET | HIGH
입력된 데이터는 string에 저장이 된다. check에 0xdeadbeef를 넣으면 되는데 check가 string보다 주소가 낮아 이때까지 해오던 BOF로 풀 수가 없다.
count에 0x08이 들어가면 count값이 감소해서 초기값이 0으로 선정되어있을 때 0x08을 받으면 count값이 –1이 되므로 string[-1] = x;가 된다. 이거는 string의 시작 주소보다 1byte 낮은 곳에 x값이 저장된다. 그렇다면 초기에 0x08을 4개 입력하여 string의 시작 주소보다 4byte 낮은 곳으로 내려가 0xdeadbeef를 입력하자.
'FTZ' 카테고리의 다른 글
FTZ level 19 (0) | 2016.12.23 |
---|---|
FTZ level 17 (0) | 2016.12.23 |
FTZ level 16 (0) | 2016.12.23 |
FTZ level 15 (0) | 2016.12.23 |
FTZ level 14 (0) | 2016.12.23 |