[ Kernel Exploit] Kernel 공부를 위한 C언어

sangjun

·

2021. 7. 20. 23:00

 

예제 코드

 __attribute__((속성))

1. __attribute__((packed))

struct register_val{
        uint64_t user_rip;
        uint64_t user_cs;
        uint64_t user_rflags;
        uint64_t user_rsp;
        uint64_t user_ss;
}__attribute__((packed));

위의 코드는 구조체로 padding이 끼지 않은 구조체를 만들고 이진코드로 만들어준다.

--> C언어 시간에 배운 구조체 크기를 sizeof해보면 실제 예상하던 크기와 다를 수 있다는게 이말이었다.

--> 1학년 때 왜 그랬던거지? 이렇게 넘겼던게 이어지는 느낌이 든다.

https://unipro.tistory.com/197

 

2. __attribute__((regparm(3)) 

이것을 함수의 인자를 넘길 때 스택을 이용해 넘기는 것이 아니라 레지스터를 이용해 넘기는 것이라고 한다.

regparm(3)안에 3은 아마 인자 3개까지 레지스터로 바로 함수인자를 넘기는거 같다.

더 자세한 설명은 아래 링크를 보길 바란다.

https://coolengineer.com/entry/fastcall

 

3. : : "r" (&rv)

void payload(){
	commit_creds(prepare_kernel_cred(0));
	asm("swapgs;"
	    "mov %%rsp,%0;"
	    "iretq;"
	    : : "r" (&rv));
}

ret2usr을 쓸 때 : : "r" (&rv)는 c언어 inline assembly언어로 mov rsp,&rv와 똑같다고 한다.