인프런 커뮤니티 질문&답변

박상준님의 프로필 이미지
박상준

작성한 질문수

리눅스 커널 해킹. A부터 Z까지

Kernel Debugging

해결된 질문

작성

·

316

0

안녕하세요
kernel ROP강의 내용중에서 질문이 있습니다.
 
test.c에서 test_write함수의 char arr[8]이지만
exp.c에서는 memset(rop,0x41,40);을 해주고 있습니다.

왜 그러는지 test_write함수를 부를 때 kernel스택 상황을 보고 싶어서 디버깅을 해보았지만 여기서 막힌 상태입니다ㅠㅠ

```
/usr/src/linux-headers-$(uname -r)/scripts/extract-vmlinux bzImage > vmlinux
gdb ./vmlinux

target remote:1234
```
이후에는 write함수에서 syscall에서 si로 커널 쪽에서 gdb가 작동하는 것을 봤지만 심볼들이 다 죽어있어 test_write함수를 실행할 때 break point를 걸 수 없었습니다.

결론적으로는 왜 arr[8]인데 memset으로 40만큼 채워주는지 원인을 찾아내지 못 했습니다.

심볼이 다 죽어있고 test_write함수(디바이스 소스코드)를 디버깅할 때 break point를 어떻게 걸 수 있을까요?
 

답변 1

0

김현우님의 프로필 이미지
김현우
지식공유자

안녕하세요.

1. exp.c 에서 memset(rop,0x41,40); 를 해주고 있지만, 이후 rop[4] 부터 rop 가젯을 넣었기 때문에 실제론 40바이트가 아닌 32바이트의 더미 값만 들어가게 됩니다(32바이트 이후부터 커널 스택의 return address가 저장되어 있음).

 

2. 커널이 실행되고, init 스크립트로 인해 모듈이 등록된 후엔 /proc/kallsyms에서 모듈의 심볼을 확인할 수 있습니다.

init 스크립트를 수정하여 root권한으로 변경한 뒤, cat /proc/kallsyms | grep test_write 명령을 통해 함수의 주소를 확인할 수 있습니다.

박상준님의 프로필 이미지
박상준
질문자

오옹 빠른 답변 감사합니다ㅎㅎ

박상준님의 프로필 이미지
박상준

작성한 질문수

질문하기