커널 4.6에서 커널 4.5까지 존재했던 crypto_hash 관련 함수가 사라졌습니다.

참조(사라진 함수..) : http://elixir.free-electrons.com/linux/v4.6-rc1/ident/crypto_alloc_hash

계속 사용하고 싶다면 비동기(crypto_ahash), 동기(crypto_shash) 중에 선택하여 사용하여야 합니다.

본 예제에서는 동기를 다룹니다. (kernel 4.10.0-38 에서 테스트 되었습니다.)



커널같은 대규모 프로젝트에서, 같은 변수나 함수명을 사용하는 경우가 많은데 이 경우 전역선언 시  static으로 선언하지 않으면 컴파일러는 같은 이름 중 어떤걸 사용해야 할 지 몰라 에러를 뱉어냅니다.

오류 LNK1169 여러 번 정의된 기호가 있습니다. ConsoleApplication15 d:\ConsoleApplication15\Debug\ConsoleApplication15.exe 1

오류 LNK2005 "int a" (?a@@3HA)이(가) ConsoleApplication15.obj에 이미 정의되어 있습니다. ConsoleApplication15 d:\ConsoleApplication15\ConsoleApplication15\j.obj 1

이를 해결하려면 변수나 함수 앞에 static 을 붙이면 됩니다. 그럼 해당 소스 내에서만 사용이 가능해집니다.


함수 내에서 static 변수를 사용할 경우

출력결과

1

2

3

1

1

1




ring 3에서 작성된 fopen, ptrace 등은 내부적으로 libc.so->syscall 방식으로 호출되는데, 직접 호출하면 libc.so를 거치지 않습니다. (후킹 등에 안전)

플랫폼 등에 따라 사용되는 레지스터가 달라질수 있으므로 gdb, ida 같은 툴에서 libc.so 열어 확인해야 합니다.

해당 플랫폼은 i386인데 ebx, ecx, edx, esi 순서대로 들어가고 있네요. 다른 머신에서의 libc도 확인해봤는데 레지스터 순서가 같은 것으로 보아 고정일 가능성이 큽니다. (아닐 수도 있으니 댓글 달아주시면 감사..추후 수정 사항이 생기면 수정하겠습니다.)

upx의 syscall 매크로를 보면, 거의 저 순서대로 들어가는 것을 확인할 수 있습니다.

https://github.com/upx/upx/blob/master/src/stub/src/include/linux.h 



+ Recent posts