본문 바로가기

system

stdin 임시버퍼

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