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를 반환해주는데 왜그런지 모르겠다 ㅠㅠ 아시는분은 좀 알려주세요
'WARGAME > hackerschool ftz,lob' 카테고리의 다른 글
[LOB 페도라 FC3] gate -> iron_golem (6) | 2014.08.30 |
---|---|
[해커스쿨 ftz] 비밀번호 (0) | 2014.08.29 |
[해커스쿨 ftz] level 19 -> level 20 (0) | 2014.08.23 |
[해커스쿨 ftz] level 18 -> level 19 (0) | 2014.08.23 |
[해커스쿨 ftz] level 17 -> level 18 (0) | 2014.08.23 |