OS
[kernel] hook sys_call_table
[kernel] hook sys_call_table
2017.10.20hook sys_call_table```c#include // included for all kernel modules#include // included for KERN_INFO#include // included for __init and __exit macros#include MODULE_LICENSE("GPL");MODULE_AUTHOR("umbum");MODULE_DESCRIPTION("sys_call_table hooking test"); #define page_offset 0xc0000000#define phys_offset 0x1a000000 // #define __NR_write 4#define __NR_target 4 typedef asmlinkage long (*sys_write_t)..
[kernel] get sys_call_table
[kernel] get sys_call_table
2017.10.16아키텍쳐마다, OS마다 동작이 다르기 때문에 상황에 맞게 생각해야 한다.다음 환경에서 테스트```bashroot@kali32:~/add_syscall# uname -aLinux kali32 4.13.0-kali1-686-pae #1 SMP Debian 4.13.4-1kali1 (2017-10-03) i686 GNU/Linux``` get sys_call_tablesys_call_table의 각 entry는 syscall function의 address이며 ``c syscall()``은 이를 참조하기 때문에, 이를 변경해주면 victim syscall을 호출할 때 마다 변경된 syscall이 호출된다.그러나 다음과 같은 제약이 있다.SYS_CALL_TABLE의 주소를 알아야 한다.SYS_CALL_TABLE..
[kernel] Page Protection
[kernel] Page Protection
2017.10.16Page Protectionx86#1 set_pages_rw , change_page_attrsource/arch/x86/mm/pageattr.c```cint set_pages_rw(struct page *page, int numpages) // use virt_to_page(){unsigned long addr = (unsigned long)page_address(page);return set_memory_rw(addr, numpages);}int set_memory_rw(unsigned long addr, int numpages){return change_page_attr_set(&addr, numpages, __pgprot(_PAGE_RW), 0);}```특정 영역(BIOS, .rodata, .....
[kernel] addr_limit : kernel space arg
[kernel] addr_limit : kernel space arg
2017.10.15addr_limitsystem call은 원래 user mode에서 호출하도록 되어 있기 때문에, system call의 인자로 넘어오는 데이터는 user space의 데이터여야 한다. 인자로 kernel space의 데이터가 넘어오면 제대로 동작하지 않는다. kernel은 `` addr_limit``를 기준으로 인자로 넘어온 데이터가 user space data인지 kernel space data를 구분한다. 따라서 이 경계를 조정해주면 user space data를 넘겨도 정상 동작하도록 만들 수 있다. /source/arch/x86/include/asm/processor.h#L421 ```ctypedef struct { unsigned long seg;} mm_segment_t; struct thr..
[ARM OS image] Android / Linaro
[ARM OS image] Android / Linaro
2017.10.15Androidhttps://developers.google.com/android/images 삼성도 android를 사용하고, android는 LINUX니까 삼성도 GPL 적용을 받지 않을까?소스코드 공개해놓았다고 하는데 나중에 필요하면 찾아보기. http://www.android-x86.org/download - x86으로 porting한 이미지. Ubuntu Linarohttp://www.linaro.org/downloads/LSK를 받으면 된다. release에 들어가면 세부 버전도 받을 수 있음.
[kernel] LKM, Loadable Kernel Module / Kernel Compile
[kernel] LKM, Loadable Kernel Module / Kernel Compile
2017.10.14Loadable Kernel Modulehttps://www.kernel.org/doc/Documentation/kbuild/modules.txt Note ) root가 아니면 `` insmod``를 사용할 수 없기 때문에, LKM을 등록할 수 없다. LKM을 이용하면 커널을 recompile/reboot하지 않아도 커널에 기능을 추가/확장할 수 있다.따라서 syscall을 추가하고, hooking하는 것도 가능하다.드라이버가 대체로 LKM으로 구현되어 있다.확장자는 `` *.ko`` 다.```bashlsmod // listinsmod // insertrmmod // removemodinfo // infomodprobe // insmod와 달리 의존 관계에 있는 모듈까지 insert해준다.``` LKM ..
[QEMU] armv7 Emulate
[QEMU] armv7 Emulate
2017.10.14이 밖에 에뮬레이터로는 모모 앱 플레이어, 녹스, 블루스택이 있음 Quick EMUlator1. qemu 설치```bashsudo apt-get install qemu-user-static qemu-system-arm``` 2. 이미지 / 부트로더 / 커널커널이 필요하고,커널을 넣을 이미지 파일이 필요하고, arm system의 경우 바이오스가 없기 때문에 부트로더 역할을 하는 initrd라는 것이 필요하다. 여기서 설치하는 커널은 armel이 아니라 armhf이다. 이것은 ARMv7명령어와 하드웨어 부동소수점 계산을 에뮬레이트 한다.```bashqemu-img create -f raw hda.img 3Gwget http://ftp.debian.org/debian/dists/wheezy/main/inst..
[kernel] virt_to_phys
[kernel] virt_to_phys
2017.10.13virt_to_phys직접 호출하고 싶다면 kernel mode에서 실행해야 하기 때문에 LKM 등을 사용해야 하며,어느 아키텍쳐든 최종 인터페이스로 다음 함수를 제공하기 때문에 이를 사용하는 편이 좋다.```cstatic inline phys_addr_t virt_to_phys(volatile void *address)``` x86 ( not x86_64 )http://elixir.free-electrons.com/linux/v4.13/source/arch/x86/mm/physaddr.c#L70```cunsigned long __phys_addr(unsigned long x){ unsigned long phys_addr = x - PAGE_OFFSET; .... return phys_addr;}``` ..
ARM Assembly
ARM Assembly
2017.10.08http://recipes.egloos.com/5027277http://armconverter.com/ - 주소 부분이 ``c 0xffffff???``로 나올 때는 직접 수정해주면 된다. ARM assembly instruction은 기본적인 명령어에 추가적인 옵션을 덧붙여 사용하는 식으로 구성되어 있다.RISK라서 모든 instruction의 크기가 같다. 단, ARM mode와 Thumb mode로 나뉜다.연산 방향은 ←arg/return value pass에 레지스터 `` r0-r3``와 stack을 사용한다.i386/amd64와 달리 ARM에서는 `` pc``에 접근해 인자로 사용할 수 있을 뿐만 아니라 수정할 수도 있다. 그러나 여기서도 `` push {pc}``는 안된다.```cint f(in..
[kernel] exploit
[kernel] exploit
2017.10.06이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
gcc options
gcc options
2017.10.01gcc공유 라이브러리 제작 / 사용 옵션```-fPIC```PIC : Position-Independent Code를 생성한다.shared library같은 경우 메모리의 어느 위치에 로딩되는지가 컴파일 타임에 결정되지 않기 때문에 절대주소 대신 상대주소(offset)를 사용하도록 컴파일하는 옵션이다. 즉, 다른 바이너리에서 이 라이브러리의 함수를 호출할 때 PLT와 GOT를 사용하도록 하는 옵션이라고 생각하면 된다.library의 mapping 주소 + offset이 해당 symbol의 주소가 된다. mapping 주소는 ldd로, offset은 nm으로 확인 가능하다. ```-shared```shared library(.so)를 생성하겠다는 의미. ```-llibrary```library는 함수 이름..
libc 버전 문제
libc 버전 문제
2017.07.23libc.so 파일을 실행하면 버전, 컴파일 시스템 등등 정보가 출력된다.* glibc source는 하나지만, 컴파일 환경(OS, Compiler)에 따라 같은 버전의 다른 libc.so가 컴파일된다.* libc 버전에 따라 에러가 발생하는 경우는 확인했는데, 같은 버전에 시스템이 다른 경우(e.g., Debian과 Ubuntu) 에러가 발생하는건 아직 못봤다. #1바이너리를 컴파일한 시스템의 libc 버전과 바이너리를 실행하는 현재 시스템에서 사용하는 libc 버전이 다른 경우 relocation error가 발생할 수 있다. #2현재 시스템에서 사용하는 libc 버전과는 다른 버전의 libc를 `` LD_PRELOAD``를 이용해 지정해 실행하는 경우, relocation error가 발생하거나 s..