ssoL2 TISTORY

[FTZ] LEVEL 11 완벽분석 본문

challenge/pwn

[FTZ] LEVEL 11 완벽분석

ssoL2 2021. 2. 1. 05:09

level11 / what!@#$?

 

hint를 보니 strcpy 함수를 이용한 bof 문제인듯! Setuid도 걸려있으니까 str을 bof해서 쉘코드를 넣으면 되겠다.

 

 

정확한 스택 구조를 알기 위해서 gdb로 살펴봅시다. 

 

 

 main 함수에서 사용하는 strcpy 함수에서 인자로 사용되는 STR 변수의 위치를 알아냄 => EBP-264

그런데 이 문제에서는 쉘코드를 STR 변수에 넣고 RET에 STR 변수 "주소"를 직접 넣어야 하므로 정확한 STR 주소를 알기 위해서 breakpoint를 이용합시다.

 

 

breakpoint를 strcpy 함수가 끝난 부분에 걸어서 인자값을 넣을 때 어느 위치에 위치해있는지 확인합시다. 

"a"를 100번 넣어서 주소를 확인하려 했는데 "Couldn't get registers: Operation not permitted." 오류가 뜹니다.

 

이는 SetUid가 걸린 파일이기 때문에 오류가 난다고 합니다. 그래서 새로운 파일을 만들어서 실험을 해야겠어요..

 

 

(SetUID가 걸려있는 attackme 실행파일 !)

 

 

/home/level11/tmp 에 실제 파일 attackme를 복사해서 gdb로 실험합시다. 

(이때, 실제 실행 파일 <attackme> 파일명의 "개수"는 같아야 환경이 같습니다.

예를 들어 attackme_1 이렇게 하면 주소가 다를 수 있어요)

 

 

이번에도 b*main+53에 걸어주고, run 할 때 NOP*239 + a*25+b*4 를 합니다.

 

앞에서 STR 변수는 EBP-264임을 알았고 이후 실제 주소를 알기 위해 a*100을 입력했었는데, 이번엔 오류가 나지 않을 것을 알기에 정확히 실행 환경을 맞춰보려 합니다. 저는 쉘코드를 25bytes 짜리를 사용할 것이기 때문에 쉘코드 대신 일단 a*25 + dummy자리 NOP*239 + ebp대신 b*4를 해서 실행합니다.

 

 

x/100x $esp 명령어로 현재 가리키고 있는 스택 포인트로부터 100 bytes를 출력합니다.

 

0xbfffefc0 주소부터 a가 담겼으니 이 주소가 STR 변수 주소임을 알 수 있습니다.

그러면 필요한 건 다 얻었으니 a 대신 쉘코드를, NOP*239는 그대로, b 대신 NOP을, RET에는 이 주소를 담아서 실행합시다.

 

 

사용한 쉘코드 25 bytes

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80

 

 

????? 그런데 Segmentation fault가 일어난다고? 정확히 gdb로 실험했을 때는 완벽했는데..............

무슨일인지 다시 gdb로 분석하자,,,

 

 

??????????????? STR 변수 주소가 0xbffff210으로 바뀌어있다.

 

아, 이거 ASLR 보호 기법이 걸려 있는 것 같다.. 

 

 

ASLR : 기본적인 메모리 보호 기법 중 하나로, stack 영역이나 data, heap 영역에서 실행을 하거나 함수를 호출할 때 주소값을 랜덤으로 변경함으로써 기존에 사용하였던 기본적인 BOF 기법을 사용하지 못하게 하는 역할을 한다. 이때는 앞에 사용했던 RET 변조 기법을 사용하지 못한다.

[출처] https://opentutorials.org/module/4290/27060

간단히 말해서 ASLR이 걸려있으면 스택 주소가 바뀌어서 내가 하려했던 RET 변조 기법을 사용 못한다. 

ASLR을 우회하기 위해 RTL 기법을 사용하자.

 

RTL(Return To Library) => libc의 주소는 변하지 않으므로 이 라이
브러리에 있는 함수를 가져다 쓴다면 문제가 되지 않는다. 우리는 system 함수의 인자에 "/bin/sh"이라는 문자열을 넣어 쉘을 실행시킬 것이다. 함수에서 return address를 libc의 System 함수로 변조하면 된다.

[출처] https://opentutorials.org/module/4290/27060

 

 

RTL exploit 구조는 다음과 같다.

 

buffer + dummy + RET자리에 SYSTEM주소 + nop*4 + /bin/sh 주소

 

=> 내가 원하는 그림은 system("/bin/sh")를 콜하는 것이다.

그럼 Return Address 자리에 system 주소를 넣고 인자로 /bin/sh을 받는다.

nop*4는 "system 함수"의 RET이고, /bin/sh는 해당 함수의 인자이므로 RET 뒤에 위치한다.

 

이제 exploit 구조를 정했으니 필요한 system 함수와 /bin/sh의 주소를 알아봅시다.

ldd 명령어로 해당 파일이 사용하고 있는 공유 library를 출력한다.

 

 

nm 명령어로 첫번째 결과 라이브러리에 system이 있는지 확인했더니 존재한다.

 

system 함수 주소는 0x4203f2c0이다. 

 

 

이제 strings 명령어와 [-tx] 옵션으로 /bin/sh의 문자열을 찾아서 16진수로 주소를 출력하자.

 

해당 주소는 0x42127ea4이다. (앞에 0x42는 생략됨)

 

 

이제 exploit code로 `python -c 'print "\x90"*(264+4) + system주소 + "\x90"*4 + /bin/sh주소 를 입력한다.

이때 주소는 리틀인디언으로 작성해야한다.

 

쉘이 등장해서 끝난 줄 알았더니 id 명령어로 확인하니까 권한이 그대로이다..

 

 

실제 attackme에는 setuid가 있지만 복사본인 attackme에는 setuid가 없기에

test는 복사본에 하되 최종적인 my-pass를 얻기 위해서는 실제 파일에 해야한다.

 

 

실제 파일에 적용하니 역시 쉘 등장했고, id 명령어로 확인해보니 권한 상승!!!! 해결 완료~

'challenge > pwn' 카테고리의 다른 글

[FTZ] LEVEL13 풀이  (0) 2021.02.01
[FTZ] LEVEL12 풀이  (0) 2021.02.01
[FTZ] LEVEL 10 풀이  (0) 2021.01.29
[FTZ] LEVEL 9 완벽 분석  (0) 2021.01.28
[FTZ] LEVEL 8 풀이  (0) 2021.01.28
Comments