[Pwnable] Lazenca - ROP(x64) 정리
2021. 3. 30. 01:35
Hacking/Pwnable
Return Oriented Programming(ROP) -x64 ROP( Return-oriented programming )는 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가있는 상태에서 코드를 실행할 수있게 해주는 기술이다. RTL + Gadgets 이 기법에서 공격자는 프로그램의 흐름을 변경하기 위해 Stack Overflow 취약성이 필요하고, "가젯(Gadgets)"이라고 하는 해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어가 필요하다. 각 가젯은 일반적으로 반환 명령어(ret)로 끝이나며, 기존 프로그램 또는 공유 라이브러리 코드 내의 서브 루틴에 있다. Gadgets - POP; POP; POP; RET x86의 경우 pop 명령어..
[Pwnable] Lazenca - ROP(x86) 정리
2021. 3. 29. 19:23
Hacking/Pwnable
Return Oriented Programming(ROP) -x86 ROP( Return-oriented programming )란? 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가있는 상태에서 코드를 실행할 수있게 해주는 기술이다. RTL + Gadgets 이 기법에서 공격자는 프로그램의 흐름을 변경하기 위해 Stack Overflow 취약성이 필요하고, "가젯(Gadgets)"이라고 하는 해당 프로그램이 사용하는 메모리에 이미 있는 기계 명령어가 필요하다. Gadgets - POP; POP; POP; RET ROP는 기본적으로 RTL 기법을 이용하며, 공격자는 RTL과 Gadgets을 이용해 공격에 필요한 코드를 프로그래밍 하는 것이다. 01.RTL(R..
[Pwnable] PLT, GOT
2021. 3. 21. 20:48
Hacking/Pwnable
PLT, GOT example4의 디스어셈블리 결과를 보면 puts와 scanf 함수를 호출할 때 해당 함수의 라이브러리 코드 주소로 바로 점프하지 않고 PLT 영역으로 점프하는 것을 확인할 수 있다. Procedure Linkage Table(PLT)는 외부 라이브러리 함수를 사용할 수 있도록 주소를 연결해주는 역할을 하는 테이블이다. Global Offset Table(GOT)는 PLT에서 호출하는 resolve 함수를 통해 구한 라이브러리 함수의 절대 주소가 저장되어 있는 테이블이다. ASLR이 적용되어 있는 환경에서, 동적으로 라이브러리를 링크하여 실행되는 바이너리(Dynamically linked binary)는 바이너리가 실행될 때마다 라이브러리가 매핑되는 메모리의 주소가 변한다. 따라서 PL..
[Pwnable] Lazenca - RTL(x64) 정리
2021. 3. 21. 01:49
Hacking/Pwnable
RTL(Return to Libc) RTL이란 Return address 영역에 공유 라이브러리 함수의 주소로 변경해, 해당 함수를 호출하는 방식이다. 해당 기법을 이용해 NX bit(DEP)를 우회할 수 있다. 이번엔 x64에서 RTL을 실습해볼 것이다. x86과 x64 차이는 쉽게 말해 x86은 32비트, x64는 64비트인것으로 구분을 하면 된다. 그렇다면 이번에도 먼저 함수 호출 규약에 대해 공부해보자! Calling Convention System V AMD64 ABI Solaris, Linux, FreeBSD, macOS 에서 "System V AMD64 ABI" 호출 규약을 사용하기 때문이다. Unix, Unix 계열 운영체제의 표준이라고 할 수 있다. Calling convention fe..
[Pwnable] Lazenca - RTL(x86) 정리
2021. 3. 20. 21:48
Hacking/Pwnable
RTL(Return to Library) RTL이란 Return address 영역에 공유 라이브러리 함수의 주소로 변경해, 해당 함수를 호출하는 방식이다. 해당 기법을 이용해 NX bit(DEP)를 우회 할 수 있다. RTL 이해하기 위해 잠깐 Calling Convention을 공부하고 가자! Calling Convention Cdecl(C declaration) 해당 호출 규약(Calling Convention)은 인텔 x86 기반 시스템의 C/C ++ 에서 사용되는 경우가 많다. 기본적으로 Linux kernel에서는 Cdecl 호출 규약(Calling Convention)을 사용한다. Calling convention features 인자 전달 방법 Stack을 이용 인자 전달 순서 오른쪽에서 ..
[Pwnable] Format String Bug
2021. 3. 18. 23:57
Hacking/Pwnable
포맷 스트링 버그는 대표적으로 printf와 sprintf와 같은 포맷 스트링을 사용하는 함수에서 사용자가 포맷 스트링 문자열을 통제할 수 있을 때 발생하는 취약점이다. 포맷 스트링에는 다양한 종류가 있고, 주어진 인자에 대해 각 포맷 별로 정해진 기능을 수행한다. 만약 공격자가 이러한 포맷 스트링을 조작할 수 있다면, printf 함수의 인자가 저장되는 스택의 내용을 읽거나 %n 혹은 %s 등 메모리 참조 포맷 스트링을 이용해 메모리 커럽션을 유발할 수 있다. 다음은 실습에 쓸 fsb.c 파일이다. // gcc -o fsb1 fsb1.c -m32 -mpreferred-stack-boundary=2 #include #include #include #include char flag_buf[50]; void..
[P4C] 우리집에 GDB 있는데… 메모리 보고갈래? (3) 정리
2021. 3. 13. 02:09
Hacking/Pwnable
DEBUGGING (IDA, GDB 사용) 우리는 이미 tomato.c 소스가 있지만, 보통 소스는 잘 주지 않기에 없다는 가정하에 디버깅을 해보겠다. IDA로 취약점 발견 헥스레이라는 강력한 기능을 제공하는 디스어셈블러이다. 헥스레이는 바이너리를 디컴파일해서 원본 코드와 흡사한 소스를 떨궈준다. F5 단축키를 누르면 다음과 같이 디컴파일한 소스(pseudocode)가 나온다. IDA에서 8번째 라인을 보면, buffer overflow 취약점이 나는 것을 쉽게 확인할 수 있다. strcpy를 할 때 복사 버퍼의 길이를 검증하지 않기에 버퍼 크기인 10보다 더 넣어줘서 bof를 일으켜 num의 값을 1로 바꾸면 될 것으로 보인다. (strcpy는 버퍼 오버플로우 취약점이 발생할 가능성이 농후하기 때문에 ..
[P4C] 우리집에 GDB 있는데… 메모리 보고갈래? (2) 정리
2021. 3. 12. 19:03
Hacking/Pwnable
tomato.c 파일은 strcpy를 할 때 복사 버퍼의 길이를 검증하지 않기에 버퍼 크기인 10보다 더 넣어줘서 bof를 일으켜 num의 값을 1로 바꾸면 될 것으로 보인다. 그리고 실습 환경을 최대한 똑같이 해주기 위해 다음과 같이 몇 가지 보호 기법들을 해제해서 컴파일 해주었다. gcc -m32 -fno-stack-protector -mpreferred-stack-boundary=2 -fno-pie -o tomato tomato.c -fno-stack-protector 옵션을 포함하는 이유 gcc가 스택을 보호하기 위해 ‘canary’라는 것을 삽입한다. 함수 내에서 사용하는 스택 프레임과 return address 사이에 'canary'를 넣는 것이다. 그리고 Buffer Overflow가 발생해..