TOOR

· TOOR
데이터 영역의 실행권한을 제거하는 기법이다. 리눅스 커널 5.4.0 미만 버전에서는 스택 뿐만 아니라 힙, 데이터 영역 등 읽기 권한이 있는 모든 페이지에 실행 권한을 부여했다. 5.4.0 이상 버전의 커널은 로더가 따로 스택 영역에만 실행 권한을 부여한다. 대충 짜서 테스트 해 봤다. # include int main() { int a = 10; char * ma = malloc(0x10); printf("%d", a); } gcc -z execstack 으로 NXbit 보호기법을 제거할 수 있다. 기본으로 컴파일하면 NX가 부여되어 있다. nonnx vmmap 으로 보면 stack 에 실행 권한이 있음을 알 수 있다. 앞서 기술 했듯이 5.4.0 이상 버전이라 스택 영역에만 실행권한이 있다. onNX..
· TOOR
내안의 버퍼가 넘친다!.. 버퍼가 넘치는 것이다. 버퍼가 어디에 위치하냐에 따라 Stack Buffer OverFlow, Heap Buffer OverFlow 가 된다. ret 덮으면 rip 변조가 가능한데 이걸 return address overwrite 라고 한다. 발생 원인으로 입력값에 대한 길이 검증이 없어서 발생하는 것이다. 흔히 scanf, gets, read, strcpy, sprintf 여기서 왜 sprintf 는 출력인데 왜 그러냐 하겠지만 int sprintf(char *str, const char *format, ...); 이 친구는 출력을 stdout 이 아닌 문자열 포인터인 str 에 입력한다. 따라서 bof 가 발생할 수 있다. 이 취약점을 막기 위해서는 입력값 검증을 해주는 함..
· TOOR
별 함수는 없다. 사용자 함수는 get_int, main 밖에 없다. main 0x00000000004011ab :endbr64 0x00000000004011af :push rbp 0x00000000004011b0 :mov rbp,rsp 0x00000000004011b3 :sub rsp,0x20 0x00000000004011b7 :movabs rax,0x6820656c706d6953 0x00000000004011c1 :movabs rdx,0x6520796172646e61 0x00000000004011cb :mov QWORD PTR [rbp-0x20],rax 0x00000000004011cf :mov QWORD PTR [rbp-0x18],rdx 0x00000000004011d3 :mov WORD PTR [..
· TOOR
Stack Frame # include void A(int arg1, int arg2){ B(arg1, arg2); } void B(int arg3, int arg4){ printf("%d, %d", arg3, arg4); } void main(){ int a = 1; int b = 2; A(a, b); } 코드는 Calling Convention 에서 사용한 코드를 가져왔다. 컴파일 하고 info stack 으로 스택프레임을 확인 해보면 아래와 같이 나온다. 사진은 Calling Convention 에서 x86 으로 실행했던거라 주소가 x64랑 다르지만 스택 프레임은 같기 때문에 그냥 썼다. 함수 프롤로그 & 에필로그 이 스택프레임을 만들고 제거하는 것은 함수 프롤로그, 에필로그이다. 이게 스택프레임을..
· TOOR
함수 호출 규약에는 stdcall, cdecl, fastcall, thiscall, vectorcall, system v 등 다양하게 있지만 본 글에서는 리눅스 gcc 가 사용하는 함수 호출 규약에 대해서만 다루도록 하겠다. Intro Caller 와 Callee Caller 는 호출자로 함수를 호출하는 함수이다. Callee 는 반대로 호출 당하는 피호출자이다. 이걸 먼저 설명하는 이유는 함수 호출규약에 따라서 인자를 어떻게 정리하는지, 어떤 함수가 정리하는지가 다르기 때문이다. 실습 코드는 다음과 같이 작성했다. # include void A(int arg1, int arg2){ B(arg1, arg2); } void B(int arg3, int arg4){ printf("%d, %d", arg3, ..
· TOOR
Why Memory Structure 프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드 되어야 한다. 또한 프로그램에서 사용될 변수를 저장할 메모리도 필요하다. 기본적으로 메모리에 로드되는 메모리의 구조는 다음과 같다. Code 영역 코드 영역은 실행할 프로그램 코드가 저장되는 공간으로 text 영역이라고도 부른다. cpu 는 코드영역에 저장된 명령어를 하나씩 가져가서 패치한다. Data 영역 데이터 영역은 프로그램의 전역 변수와 정적 변수가 저장되는 영역이다. 프로그램의 시작과 함께 할당되며 프로그램이 종료되면 소멸한다. Stack 영역 높은 주소에서 낮은 주소로 자라는 LIFO 구조의 영역이다. 지역 변수나, 함수 내에서 필요한 인자, 스택 프레임 등이 저장된다. push 명령어로 데이터를 ..
lmxx
'TOOR' 카테고리의 글 목록 (5 Page)