System Hacking (pwnable)/hackerschool FTZ Write-up 20

[FTZ] level20 ( write - up )

대망의 마지막 문제의 코드는 FSB 취약점이 있다. bleh는 80의 크기고, 입력을 최대 79만큼 받을 수 있어 오버플로우가 나지는 않는다.하지만, printf함수 부분을 보면 FSB 버그가 발생하는것을 알 수 있다. 오버플로우가 불가능하니 ret을 건들기가 상당히 힘들다.그래서 우리는 .dtors라는것을 사용할것이다.ret은 함수가 끝나면 실행되는것이고, 프로그램이 끝나면 .dtors(소멸자)를 실행하는데, 그 주소를 확인해보자.0x08049594라고 한다. FSB에서 .dtors를 사용할때는 4바이트를 더한다. .dtors+4는 보통 0으로 셋팅되어있다. 하지만 이 값이 0이 아니면, 프로그램이 종료하고 그부분을 실행해버린다. 그래서 dtors + 4를 하는것이다.일단 쉘을 따긴 땄는데, 이걸 어떻..

[FTZ] level19 ( write - up )

코드가 몹시 간단하다. 그냥 오버플로우가 나는것을 볼 수 있다.setuid가 걸려있긴 하지만, 프로그램 내부에서 setuid를 설정해주지 않아서 아무리 쉘을 이쁘게 따도 level20권한의 쉘이 안따졌었다. 그래서 그냥 setuid 쉘코드를 구해서 사용했다.버퍼에 쉘코드를 삽입하고 NOP sled 기법을 사용해도 상관없지만 나는 환경변수를 사용하였다. 이렇게 환경변수를 등록해주고.. 요렇게 Exploit한다! 끝!

[FTZ] level16 ( write - up )

이번에는 함수포인터를 변조시키는 문제인것 같다. 취약점은 fgets에서 터진다. 함수포인터를 할당해주는 모습이다.ebp-16에 있는 함수포인터에 0x8048500 라는 주소를 넣는데, printit 함수의 것일것이라고 추측할 수 있다. 그리고, buf는 ebp-56에 할당되어있다. 따라서 함수포인터와 buf사이의 거리는 40이다.하지만 입력을 48만큼 받으니 오버플로우로 쉘을 따보자. shell함수의 주소는 노랑색으로 칠한 부분과 같다. 뾰오오오오옹!

[FTZ] level13 ( write - up )

이것 또한 strcpy의 취약점으로 발생하는 버퍼오버플로우다.하지만 스택 가드가 존재한다. 변수 i의 값을 건들면 안된다.즉, 변수 i와 변수 buf의 거리를 계산해서, 변수 i에 리틀엔디안으로 0x1234567을 넣어주면 될듯 하다! 일단 함수 프롤로그 후 변수를 0x418 (1048) 만큼 할당한다.그리고 buf의 크기는 1024이다. 그리고 main+69 부분에서 ebp-12의 값과 0x1234567을 비교하므로 ebp-12가 변수 i임을 알 수 있다.그리고 직접 브레이크 포인트를 걸고 동적 디버깅을 해서 변수의 거리를 알아낸다.-> dummy data를 구하기 위해서! ret은 1048 + 4라는 것을 생각해보았을때, buf 1024 + dummy 12 + i 4 + dummy 12 + EGGSH..

[FTZ] level12 ( write - up )

printf 부분에 뭔가 깨진다... 어쨌든 gets에서 얼마나 입력받는지 검사하지 않아서 취약점이 발생한다. 코어파일을 열어보려고 ulmit -c unlimited 명령어로 코어파일이 생성 될 수 있도록 만들어 주었다.실제로 코어파일이 생성되는것을 알 수 있다. 이렇게 생성된 코어파일로, 버퍼의 시작주소를 알아보자. 노란색으로 표시한 부분이 다음과 같다.일단은 쉘을 땄다.이 기법은 NOP sled 라는 기법이다. 말그대로 NOP코드에 shell코드를 썰매를 태우는 것이다. NOP코드는 아무것도 안한다는 의미로, ret가 NOP의 어딘가로 변조되었을때, 그대로 놉코드를 따라서 쉘을 실행한다. 안전성을 위해 앞뒤로 NOP코드를 넣어주어서, Exploit은 다음과 같다. NOP + Shellcode + RE..

[FTZ] level11 ( write - up )

level11부터는 홈에 다음 레벨의 setuid가 걸려있고 취약점이 있는 attackme 파일이 주어진다.이 프로그램의 취약점은 strcpy함수에서 터진다. str 변수는 char 형으로 256만큼 선언되어있다. 하지만 입력받을때 256을 넘어가는 수를 입력하면 strcpy 함수로 문자열을 복사할때 256을 넘어가서 복사해버린다. 즉, 잘못된 메모리 공간을 변조 시킬 수 있는것이다. 쉘코드를 실행시켜주는 eggshell의 소스를 복사해서 컴파일시키고, 실행시킨다. 그러면 환경변수에 EGG라는 이름의 환경변수가 등록된다하지만, eggshell을 실행시킬때마다 eggshell의 주소는 달라지게 된다. 따라서, 정확한 환경변수의 주소를 알아오기 위해, 코딩을 해준다. getenv함수는 환경변수의 주소를 가져..