fget() 함수에서 사용자 입력을 받을 때 stdin 임시버퍼에 입력 값을 받아주게 된다.
memset() 같은 함수로 버퍼를 초기화하더라도 stdin 임시버퍼에는 값이 남아있다. 이러한 점을 이용하여 우리는 exploit 에 이용할 수 있다.
fgets(buffer, 256, stdin); 를 gdb로 분석하면 다음과 같다.
0x804871a <main+6>: mov %eax,%ds:0x8049a3c // stdin
0x804871f <main+11>: push %eax
0x8048720 <main+12>: push 0x100 // 256byte
0x8048725 <main+17>: lea %eax,[%ebp-40]
0x8048728 <main+20>: push %eax // buffer address
0x8048729 <main+21>: call 0x8048408 <fgets>
(gdb) x/x 0x08049a3c
0x8049a3c <stdin@GLIBC_2.0>: 0x401068c0
(gdb) x/x 0x401068c0
0x401068c0 <_IO_2_1_stdin>: 0xfbad2098 0x40015000 0x40015000 0x40015000
(gdb) x/x 40015000
0x40015000 0x90909090 0x90909090 0x90909090 0x90909090
0x40015010 0x90909090 0x90909090 0x90909090 0x90909090
위에서 보면 0x40015000 주소 값이 연속 3번 이어진다.
마지막 3번째 나오는 0x40015000 주소 값이 stdin 의 시작주소이다.
이렇듯 위의 특징을 이용하여 exploit 에 이용할 수 있다.
'system' 카테고리의 다른 글
Use-After-Free 취약점 (0) | 2016.11.08 |
---|---|
Back(` `) , Single(' '), Double(" ") Quotes, Blackslash(\) (0) | 2016.11.04 |
LD_PRELOAD (0) | 2016.10.05 |
ctors, dtors section (0) | 2016.09.30 |
core dump 생성 (0) | 2016.07.28 |