전체 글

hacking/pwnable

Return to dl-resolve

Return to dl-resolve 기법이란 프로그램에서 동적라이브러리 함수의 주소를 찾기 위해 Lazy binding을 사용할 경우 활용이 가능한 기법이다. Lazy binding Lazy Binding Lazy Binding이란 Dynamic Linking 방식으로 컴파일된 ELF 바이너리는 공유 라이브러리에 있는 함수의 주소를 동적으로 가져오기 위해 사용하는 방법이다. 이때 GOT(Global Offset Table) 테이블을 이용하게 된 hogbal.tistory.com Lazy binding을 위해 다음과 같이 함수가 호출된다. _dl_runtime_resolve() -> _dl_fixup() -> _dl_lookup_symbol_x() -> do_lookup_x() -> check_match..

hacking/pwnable

Return to csu

return to csu 기법은 __libc_csu_init() 함수의 일부 코드를 Gadget으로 이용하는 기법이다. 만약 ROP 기법을 이용할 수 있지만, gadget이 부족할 경우 해당 기법을 이용해 Exploit이 가능하다. __libc_csu_init() return to csu에서 사용되는 코드는 다음과 같다. void __libc_csu_init (int argc, char **argv, char **envp) { ... const size_t size = __init_array_end - __init_array_start; for (size_t i = 0; i < size; i++) (*__init_array_start [i]) (argc, argv, envp); } 해당 코드에서 gadg..

hacking/pwnable

UAF(Use-After-Free)

UAF(Use After Free) 기법은 메모리를 할당 받고 사용한 이후, 해제했을때 데이터가 지워지지 않는다는 점을 이용한 기법이다. 즉, a라는 변수에 10을 할당하고 해제한 다음 b라는 변수를 다시 할당하게 된다면 10이라는 값이 그대로 남아있게 된다. Example 다음 코드와 같이 프로그램이 2개의 메모리를 할당하고, 첫 번째 메모리를 해제한 후 비슷한 크기의 메모리 할당을 요청하면 이전에 해제된 메모리가 할당된다. 그리고 c는 a가 할당받은 메모리와 같은 영역의 포인터를 가지게 된다. 즉, c가 가지고 있는 포인터를 이용하여 데이터 변경 및 출력, 함수 호출이 가능하다. #include #include #include int main() { char* a = malloc(160); char*..

hacking/pwnable

Double Free Bug

Double Free Bug는 메모리를 중복으로 해제할 경우 할당자는 해당 chunk들을 중복으로 할당받을 수 있다는 것을 이용한 기법이다. libc < libc 2.26 동적할당된 메모리를 해제하면 fastbin에 저장되게 되는데 이를 이용해 Dobuble Free Bug 기법을 사용할 수 있다. libc 2.26 = libc 2.29 libc 2.29 버전부터 tcache에서 발생하는 Double Free Bug를 패치했기 때문에 이를 우회하지 않으면 사용할 수 없다. 다음 내용부터 fastbin에서 발생하는 Dobule Free Bug를 토대로 설명을 하겠다. Example 다음 코드는 malloc() 함수를 이용해 크기가 112byte인 메모리 할당을 3번 요청한다. 이 코드는 free() 함수를..

hacking/pwnable

Frame Pointer Overwrite(One-byte Overflow)

Frame Pointer Overwrite(FPO) 기법은 SFP(Stack Frame Pointer)를 1byte 덮어써서 코드의 흐름을 변경하는 기법이다. x86 바이너리의 경우 스택을 16 byte 경계에 정렬하는 코드가 추가된다. Stack alignment at 16-byte boundary 다음과 같이 16byte 경계에 스택을 정렬하기 위한 코드가 동작한다. main() 함수가 시작되는 부분에서는 이전 함수에서 사용하던 Frame Pointer를 Stack에 저장하기 전에 Stack alignment을 진행한다. main() 함수가 종료되는 부분에서는 다음과 같이 동작한다. leave 명령어 실행 전, ebp 레지스터에 저장된 주소에 0x4를 뺀 영역에 저장된 값을 ecx 레지스터에 저장한다..

hogbal
hogbal