2022. 3. 10. 17:22ㆍSite/FTZ
이번시간에는 level18에 대하여 풀어보겠습니다
공부를 하는 입장이니 틀린게 있어도 양해부탁드리겠습니다
먼저 ls -al을 통해 전체 디렉토리와 파일을 확인해보니 attackme가 보입니다
힌트파일을 열어주었는데 못보던 코드도 보이고 힌트가 역대급으로 기네요...
다는 모르겠어서 중요한 부분만 분석해보겠습니다
char형 stirng에 100bytes할당
int형 check변수 선언, int형 x 0으로 초기화, int형 count 0으로 초기화, fd_set의 구조체 fds선언(구글링)
printf("Enter your command") 출력, 출력버퍼를 fflush로 청소(구글링)
while무한루프돌려주며 count가 100이상이면 printf출력, check가 0xdeadbeef면 shellout()을 실행시켜주네요
같지않으면 FD_ZERO()로 fds를 초기화(구글링)시켜주네요
read()에서 입력받은것을[stdin]을 1byte읽어서 x에 저장해줍니다
switch구문을 통해서 x값을 읽어들어 '\r','\n'을 입력시 '\a'출력, 0x08을 입력하면 count값을 감소하고 "\b"가 2번출력되어 문자를 지우고 디폴트에서는 x를 string에 저장하고 count값을 증가시킵니다
shellout()에는 setreuid[level19ID]가 담겨있습니다
일단 선언부분에서 string[100]이 check보다 먼저 선언되어있기 때문에 전처럼 버퍼오버플로우하는 방법은 안통할것같습니다...
접근방법
check와 0xdeadbeef를 일치시키게만 해주면 되는데 string[100]이 check의 앞에 위치하기 때문에 현재 상태로서는 접근할수없을 것 같은데...
그런데 switch부분에 0x08을 입력하면 string배열의 인덱스 값이 1씩 감소됩니다.
아마 string의 배열인덱스 -1씩 하면서 뒤로빠지면서 check의 주소값위치에 접근을 할것 같다는 느낌이드네요...
그러긴 위해선 먼저 check의 위치와 string의 위치를 파악해야될것같습니다
gdb를 통해 attackme를 실행시켜주었습니다
main+3부분에서 256bytes[0x100]만큼 공간을 확보하고 main+91에서 0xdeadbeef랑 [ebp-104]랑 비교하고있네요...
아마[ebp-104]의 위치는 check가 아닐까 생각이듭니다
이제 string의 주소값만 찾아주면 될것 같습니다
main+409에서 read함수를 호출하고
main+471,main+489에서 printf함수가 2번호출되고 [ebp-100]부분에서 string함수의 주소값이 보입니다
string인걸 예상할 수 있는것은 check의 위치가 [ebp-104]인데 check보다 먼저 선언된 변수는 string밖에 없으니 string은 무조건 check보다 ebp에 가까워야 됩니다. 또한 check가 int형인 4bytes이므로 거리차이도 4bytes차이가 나므로[ebp-100]이 string인것을 예측할수있겠네요
string과 check의 거리는 4bytes차이가 나니 0x08을 4번입력하여 string의 인덱스를 [ebp-104]위치로 옮겨서 check의 주소값에 접근하여 0xdeadbeef를 덮어씌워주면 될 것 같습니다
다음시간에는 level19를 풀어보겠습니다
'Site > FTZ' 카테고리의 다른 글
FTZ level20 (0) | 2022.03.13 |
---|---|
FTZ level19 (0) | 2022.03.10 |
FTZ level17 (0) | 2022.03.09 |
FTZ level16 (0) | 2022.03.09 |
FTZ level15 (0) | 2022.03.09 |