basic_exploitation_000
전체적인 스케치: scanf 함수를 통해 buf에 쉘코드를 삽입하고, 스택 버퍼 오버플로우를 통해 메인 함수의 return address를 buf의 시작주소로 옮겨, buf에 들어가있는 쉘코드를 실행시킴으로서 쉘을 획득하면 되는 문제이다. 다만 주의해야할 점은, 1) 쉘코드 작성시 scanf 함수는 'x09, x0a, x0b, x0c, x0d, x20'와 이 이후의 값들을 읽어들이지 못 하기 때문에, 이를 우회한 쉘코드를 이용해야한다 2) x86 아키텍처에서 실행되는 execve syscall이므로, x86-64 아키텍처와 들어가게 되는 인자의 레지스터가 다르다. 이는 아래의 사진을 참고하자 사진을 통해 x86(32bit) 아키텍처에서의 execve의 인자 레지스터로는 eax, ebx, ecx, edx가..
Exploit Tech: Return Address Overwrite(리턴 주소 변경 및 실습)
이번 글에서는 ret 주소를 버퍼 오버플로우를 통해 변경하는 실습을 함께 해볼 것입니다. 소스 코드: #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } void get_shell() { char *cmd = "/bin/sh"; char *args[] = {cmd, NULL}; execve(cmd, args, NULL); } int main() { char buf[0x28]; init(); printf("Input: "); scanf("%s", buf); return 0; } 설명: 위의 소스 코드에는 shell을 실행시킬 수 있는 get_shell이라는 함수가 존재합니다. 이 취약점을 이용하여 메인함수의..
Quiz: Calling Convention(퀴즈: 함수 호출 규약)
*Quiz 1, 2, 3, 4 풀이: 위의 소스코드를 보면 cdecl 호출 규약을 사용한다는 걸 알 수 있다. cdecl에서 인자는 역순으로 push 되므로, (a)에는 push 0x3 (b)에는 push 0x2 (c)에는 push 0x1이 들어간다 (d)에서는 sum 함수의 반환값이 eax에 저장되고 push되어있던 세 인수를 정리해줘야 하므로, 12byte(int인수 세 개)만큼이 줄어들어야한다.(x86 아키텍처에서는 push될 때 0x4만큼씩의 공간이 할당된다) 따라서 (d)에는 add esp, 0xc가 들어간다. *Quiz 5, 6, 7 풀이: SYSV에서는 인자가 RDI, RSI, RDX, RCX, R8, R9 순으로 저장 된다. 또한 인자가 역순으로 저장된다. 따라서 (a)에는 mov rdx,..