커널 memcpy는 실제로 지정된 길이보다 더 많은 바이트를 복사합니다.

커널 memcpy는 실제로 지정된 길이보다 더 많은 바이트를 복사합니다.

커널 패닉 문제가 있습니다.

BUG: unable to handle page fault for address: ffff88812c410000 

스택 정보 표시

ip_frag_next-->skb_copy_bits-->memcpy_orig+52

분석 결과 수신된 memcpy 호출은 620바이트였지만 충돌로 인해 107520바이트가 복사된 것으로 나타났습니다. 결과는 액세스 예외입니다.

이런 일이 발생하는 원인은 무엇입니까?

RDX: 현재 오프셋
RBX: memcpy의 지정된 길이
RAX: memcpy의 대상 포인터
RDI: 타겟의 현재 위치
    [예외 RIP: memcpy_orig+52]
    RIP: ffffffff80a98ed4 RSP: ffffc90000067698 RFLAGS: 00010282
    RAX: ffff88812c3f5c24 RBX: 000000000000026c RCX: 0000000000001cfc
    RDX: fffffffffffe5e4c RSI: ffff888002b3014a RDI: ffff88812c40ffe4
    RBP: ffff88812c3f5c24 R8: 657fc3fb17a4d6f3 R9: 763c3854b6c4e057
    R10: 55cc9b5ed64cab61 R11: 2afd84bbcdd9c7a3 R12: ffffffff814cbbc0
    R13: 000000000000026c R14: 0000000000001cfc R15: 0000000000001f68


충돌 > dis -r memcpy_orig+52
0xffffffff80a98ea0: mov %rdi, %rax
0xffffffff80a98ea3 : cmp $0x20,%rdx
0xffffffff80a98ea7 : jb 0xffffffff80a98f27
0xffffffff80a98ea9: cmp %dil,%sil
0xffffffff80a98eac:jl 0xffffffff80a98ee3
0xffffffff80a98eae : 하위$0x20,%rdx
0xffffffff80a98eb2: 하위 $0x20, %rdx
0xffffffff80a98eb6: mov (%rsi), %r​8
0xffffffff80a98eb9: 0x8(%rsi),%r9 이동
0xffffffff80a98ebd : 0x10(%rsi),%r10 이동
0xffffffff80a98ec1: 0x18(%rsi),%r11 이동
0xffffffff80a98ec5 :lea 0x20(%rsi),%rsi
0xffffffff80a98ec9: %r8 이동,(%rdi)
0xffffffff80a98ecc: %r9,0x8(%rdi) 이동
0xffffffff80a98ed0 : %r10,0x10(%rdi) 이동
0xffffffff80a98ed4 : %r11,0x18(%rdi) 이동

코드에 따르면 memcpy는 지정된 620바이트의 데이터만 복사해야 합니다. 하지만 107520바이트가 넘는 데이터를 복사해 결국 액세스 예외가 발생했습니다.

관련 정보