이번 강의에서는 _IO_FILE을 이용해 임의 메모리 주소의 값을 쓰는 익스플로잇을 설명합니다.
강의 설명
강의 목표
_IO_FILE을 이용해 임의 메모리 주소의 값을 쓰는 익스플로잇을 이해한다.
이 강의와 관련된 질문들입니다.
2개의 질문
페이로드 전송시에 "\x00"*1024 존재이유
패이로드 전송시에 "\x00"*1024를 덧붙여서 보내는데, 이유가 무엇인가요?
```python
p.sendline(p64(0xDEADBEEF)+b"\x00"*(1024-10))
```
와 같이
fread안에서 호출된 read에 전송하는 패이로드 길이가 8+1014 미만인 경우
(반드시 1022를 넘어야 익스가 됨)익스가 되지 않는데, 무엇때문인가요?
libc 소스코드를 보니,
_IO_new_file_underflow 함수의
다음 구문 때문일것으로 추측중인데
(read의 반환 값에 의해 달라지는 값 -> count 변수)
```c
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 값을 이용하거나 하는 부분은 보이지 않아 잘 이해가 가지 않습니다 ㅠ
강의 자료에 오타가 있는것 같습니다.
read(fd, buf, size) 형식을 고려했을때,
_IO_buf_end를 overwrite_me의 주소로 조작하고
_IO_buf_base를 overwrite_me+1024 보다 큰 값으로 조작하는 것이 아니라
_IO_buf_base를 overwrite_me의 주소로 조작하고
_IO_buf_end를 overwrite_me+1024 보다 큰 값으로 조작해야 하는 것 아닌가요??
익스플로잇 코드에는 해당 내용이 반영되어있어 글 남겨봅니다.
이 강의가 포함된 로드맵

드림핵이 추천하는 강의입니다.
같이 들으면 좋은 강의

Exploit Tech: _IO_FILE Arbitrary Address Write

Free
상세정보
약 2 hours 소요
매우 어려운 난이도
없음