완료됨
페이로드 전송시에 "\x00"*1024 존재이유
패이로드 전송시에 "\x00"*1024를 덧붙여서 보내는데, 이유가 무엇인가요?
p.sendline(p64(0xDEADBEEF)+b"\x00"*(1024-10))
와 같이
fread안에서 호출된 read에 전송하는 패이로드 길이가 8+1014 미만인 경우
(반드시 1022를 넘어야 익스가 됨)익스가 되지 않는데, 무엇때문인가요?
libc 소스코드를 보니,
_IO_new_file_underflow 함수의
다음 구문 때문일것으로 추측중인데
(read의 반환 값에 의해 달라지는 값 -> count 변수)
int count = _IO_SYSREAD (fp, fp->_IO_buf_base, fp->_IO_buf_end - fp->_IO_buf_base);**
if (count <= 0)
{
if (count == 0)
fp->_flags |= _IO_EOF_SEEN;
else
fp->_flags |= _IO_ERR_SEEN, count = 0;
}
fp->_IO_read_end += count;
if (count == 0)
{
/* If a stream is read to EOF, the calling application may switch active
handles. As a result, our offset cache would no longer be valid, so
unset it. */
fp->_offset = _IO_pos_BAD;
return EOF;
}
if (fp->_offset != _IO_pos_BAD)
_IO_pos_adjust (fp->_offset, count);
return *(unsigned char *) fp->_IO_read_ptr;
}
libc_hidden_ver (_IO_new_file_underflow, _IO_file_underflow)
결국 count 값을 fp->_offset 에 더해주는데, 이 count 값이 특정 길이 (여기서는 1022) 가 넘지 않으면 문제가 생기는 것으로 이해하였습니다..
이외에 fp->_offset 값을 이용하거나 하는 부분은 보이지 않아 잘 이해가 가지 않습니다 ㅠ
#시스템해킹
#공격기법
#io_file
작성자 정보
답변
1
5unkn0wn
강의 수강: 50
안녕하세요, 코드 상 파일에서 fread를 할 때의 사이즈가 1024로 들어있는 상태에서 stdin으로 입력을 받게 되면 EOF가 전달되지 않아 계속 입력을 받게됩니다.
파일에서 입력을 받을 때에는 내용을 모두 읽은 후, 자동으로 EOF가 반환되기 때문에 1024바이트를 전부 입력받지 않아도 입력이 끊기지만, stdin은 그렇지 않기 때문에 1024바이트를 전부 채워주어야 입력이 종료됩니다.