본문 바로가기

Security/Pwnable

[FTZ] level 11 문제풀이

 

 

힌트를 먼저 봐보자 !

 

 

힌트를 보면, argv[1]의 값을 str에 복사해준 후 출력을 해 주는데,

복사해주는 부분이 취약하다는 것을 알 수 있다.

 

왜 취약할까 ??

 

strcpy 함수는 문자열을 복사하는 함수로, 복사하는 버퍼(argv[1])의 크기를 검증하지 않고 복사한다.

따라서 str의 크기인 256byte를 넘는 데이터를 str에 복사할 수 있게 되고, 이것은 buffer overflow 공격을 가능하게 하여 공격자가 원하는 대로 할 수 있기 때문에 취약하다고 할 수 있는 것이다.

 

 

그럼 이제 이 취약한 부분을 이용해 쉘을 얻어보자 !

 

 

먼저, 쉘을 얻어올 수 있는 쉘코드는 다음과 같다.

\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31 \xc0\x50\x68\x2f\x2f\x73\x68\x68

\x2f\x62\x69\x6e\x89\xe3\x50\x53\x8 9\xe1\x31\xd2\xb0\x0b\xcd\x80

 

이 쉘코드를 메모리 어딘가에 저장을 하고, 쉘코드가 저장되어 있는 주소를 ret에 넣으면 쉘을 얻어오게 되는 것인데,

이 공격을 시도하는 방법으로는 nope sled, 환경변수 이용, 이 2가지로 이번 풀이에서는 환경변수를 이용해 볼 것이다.

 

환경변수를 이용하는 방법은 쉘코드를 환경변수에 저장하는 것으로, 먼저 다음과 같이 환경변수 sc에 쉘코드를 저장해준다.

 

 

그 후, 쉘코드가 저장되어 있는 주소를 알아야 하기 때문에 다음과 같은 코드를 짠 후 컴파일 하여 쉘코드의 주소를 얻는다.

 

 

 

이제, ret에 환경변수 주소인 0xbfffff0f를 넣어줘야 한다.

 

하지만, 지금은 str에 얼마나 많은 값을 넣어줘야 ret를 덮을 수 있을지 모르고 있는 상황이므로, str과 ret에 거리를 알기 위해 gdb를 이용해보자!

 

 

<main+41>에서 [ebp-264]는 str이라는 것을 알 수 있으므로, 스택의 모습은 다음과 같다.

 

 

 

따라서 str과 ret의 시작까지의 거리는 268임을 알 수 있고, 그러므로 '어떤 문자*268 + 쉘코드의 주소'를 str에 넣어주면 ret에 쉘코드 주소값이 들어간다는 것을 알 수 있다.

 

해주면 !

 

 

level 12의 비밀번호를 얻을 수 있다! 

 

 

 

'Security > Pwnable' 카테고리의 다른 글

[FTZ] level 9 문제풀이  (0) 2020.02.11
함수의 프롤로그와 에필로그  (2) 2020.02.09
해쿨 핸드북 정리  (0) 2020.01.02