본문 바로가기

WARGAME/hackerschool ftz,lob

[해커스쿨 ftz] level 20 -> Clear

hint

#include <stdio.h>

int main (int argc, char **argv)

{

char bleh[80];

setreuid(3101, 3101);

fgets(bleh, 79, stdin);

printf(bleh);

}




풀이

1. 이번 문제는 포맷스트링 버그 문제이다. 에그쉘을 이용하여 풀이하는데, 랜덤 스택이 걸려있어 .dtors 주소를 이용하여 풀이하도록 한다.

1-1 .dtors 주소 확인

현재 주소는 0x08049594이고 여기에 +4를 한 값이 실제 주소이다.



1-2 에그쉘을 이용하여 환경변수에 쉘코드 올리기



2. 공격 코드 작성

     2-1 bleh[]의 위치 확인

%x를 4개 썻을 때 출력되었으므로 printf()로부터 bleh[]의 거리를 알 수 있다.(12바이트)


2-2 공격 코드 예상

     [AAAA][\x98\x95\x04\x08][AAAA][\x9a\x95\x04\x08][%8x%8x%8x][%(0xf275-40)d][%hn][%(0x1bfff-0xf275)d][%hn]

위 코드에서 printf()는 [AAAA][\x98\x95\x04\x08][AAAA][\x9a\x95\x04\x08] 를 출력하게 되고

뒤 이어 %8x를 세 번 읽으면서 esp를 bleh[]의 위치로 옮기게 된다. 

그 다음 [%(0xf275-40)d] 에 의해 맨 앞의 AAAA가 정해진 자리수만큼 출력되고, 바로 뒤의 %hn에서 그 크기 만큼 [\x98\x95\x04\x08]의 주소에 2바이트를 작성한다.


마지막으로, [%(0x1bfff-0xf275)d] 에서 두 번째로 있는 AAAA를 정해진 자리수 만큼 출력하고, 그 뒤의 %hn에서 그 크기만큼 [\x9a\x95\x04\x08]의 주소에 2바이트를 작성하여 결과적으로 .dtors의 주소에 에그쉘로 얻은 주소를 작성하게 되고, 프로그램 종료 시 .dtors를 읽을 때 쉘코드가 올려진 환경변수로 리턴하게 된다.


2-3 공격 수행



풀이 중 에그쉘을 실행하여 환경변수에 쉘코드를 올리고 정확한 환경변수 주소를 얻기 위한 소스를 컴파일하여 실행하였더니 첫 1회에 반환해주는 주소값으로는 도저히 성공할 수 없었다. 한 번더 실행하여 반환해주는 주소값을 이용하였더니 성공하였다.

첫 1회에는 0xbffff28a 라는 주소값을 반환하고 2회부터는 0xbffff275를 반환해주는데 왜그런지 모르겠다 ㅠㅠ 아시는분은 좀 알려주세요