본문 바로가기

스터디/system22

Stack Frame Pointer Overflow - 프레임 포인터 오버플로우 LOB 다크나이트 문제에서 사용되는 기술인 프레임 포인터 오버플로우 입니다. SFP의 1바이트를 조작해 공격한다는데서 1바이트 오버플로우라는 별명도 있습니다. 설명이 매우 잘 되어있으므로 보면서 공부하시면 됩니다. 2011. 9. 4.
[Chapter 1] 리눅스 시스템 프로그래밍 시작 (1) 유닉스(UNIX) 운영체제는 벨 연구소에서 제작되었으며 그 중 1970년대 PDF 컴퓨터들을 위해 설계된 유닉스는 다중 프로세서 서버들과 슈퍼컴퓨터들에 이르기까지 다양한 하드웨어 플랫폼을 위한 다중 사용자, 다중 태스킹 운영체제로 유명했다. (2) 리눅스(LINUX) 운영체제는 리누스 토발즈가 유닉스 프로그래머들의 도움을 받아 제작했으며 유닉스류 커널의 한 부분이다. 유닉스에서 실행되는것은 실제로 리눅스에서도 거의 실행된다. (3) 리눅스 프로그램 워게임에서 설명한적이 있지만, 리눅스 시스템에 로그인하고 쉘이 실행되고 우리는 쉘과 상호작용하면서 프로그램을 실행한다. 우리가 입력한(요청한) 명령어를 먼저 쉘(보통 bash)의 명령어인지 확인하고 그렇지 않을경우 특정 폴더안에 (명시되어있는)선언되어있.. 2011. 8. 21.
리눅스 심볼릭링크와 하드링크 리눅스에 링크는 심볼릭링크와 하드링크 두 가지가 있다. 먼저 심볼릭 링크는 간단하게 윈도우즈에서의 바로가기라고 생각하면 된다. ln -s 원본파일이름 링크파일이름 [gate@localhost iyounges.org]$ ls iyounges [gate@localhost iyounges.org]$ ln -s iyounges iyounges_ [gate@localhost iyounges.org]$ ls -l total 0 -rw-rw-r-- 1 gate gate 0 Aug 20 02:55 iyounges lrwxrwxrwx 1 gate gate 8 Aug 20 03:06 iyounges_ -> iyounges 이처럼 사용해주면 된다. 그런데 심볼릭 링크는 단지 바로가기 일뿐, 파일 안은 텅텅 비어있으며 심볼릭.. 2011. 8. 21.
리눅스 GDB 어셈블리어 AT&T 문법을 intel 문법으로 바꾸는 방법 //AT&T -> INTEL 먼저 AT&T 와 INTEL 둘의 문법 차이를 설명해보자면 mov $esp, $edx // EDX 에 ESP 를 복사한다. (AB) 이 둘이 서로 같은 뜻을 의미한다. 대체적으로 intel 문법이 특수문자를 사용하지 않고 해석방법도 매우 간단하다. 그래서 올리디버거를 사용하는 초보자들은 GDB 로 넘어오면 어려움을 호소하는데 이를 해결하는 방법이 있다. GDB 를 실행하고 다음과 같은 명령어를 입력한다. (gdb) set disassembly-flavor intel 종료하고 다시 실행하면 원래 AT&T 문법으로 돌아오는데 다음 명령어를 실행하면 intel 문법으로 고정된다. (gdb) set disassembly-flavor intel (gdb) q $echo "set disassembly-flavor .. 2011. 8. 20.
[GDB-Analysis] GDB 바이너리 디버깅 3 이번에는 저번에 두개로 했던 것들과 strcat 함수를 곁들여 컴파일해 디버깅을 해보도록 하겠습니다. 다음부터는 버퍼 오버플로우와 관련된 함수를 주제로 디버깅 연습을 해갈 생각입니다. [gate@localhost tmp]$ cat t3.c #include #include int main(int argc, char *argv[]) { char buffer[40]; printf("%d ", argc); printf("%s ", argv[0]); printf("%s ", argv[1]); printf("%s ", argv[2]); printf("%s\n", argv[3]); strcpy(buffer, argv[1]); printf("%s\n", buffer); strcat(argv[2], argv[3]); p.. 2011. 8. 18.
[GDB-Analysis] GDB 바이너리 디버깅 2 이번에는 버퍼 오버플로우 취약점으로 자주 등장하는 strcpy 함수를 디버깅 해보겠습니다. 너무 쉬워보일수도 있겠지만 모든것들이 패턴이 있습니다. 함수가 호출되기전에 어떻게 인자를 참조하는지 이 작업은 무엇을 의미하는지, 저 또한 공부한지 별로 안됬지만 조금 알것같습니다. 이런 밑거름들을 차근차근 해나가다가 나중에는 워게임 하나를 디버깅해 취약점을 찾아낸다는지.. 가능할겁니다. [gate@localhost tmp]$ cat t2.c int main(int argc, char *argv[]) { char buffer[40]; strcpy(buffer, argv[1]); // argv[1] 을 buffer 에 복사합니다. printf("%s\n", buffer); // 복사된 buffer 을 출력합니다. }.. 2011. 8. 17.
[GDB-Analysis] GDB 바이너리 디버깅 1 제가 직접 간단하게 소스를 만들어 디버깅을 할 생각입니다. 워게임을 풀면서 많이나오는 소스들을 가지고 디버깅을 해볼 생각입니다. (argv, strncpy 인자 불러오기 등등) 물론 IDA 로해야지 쉽고 빠르지만 그것보다 평소 디버깅 실력을 높이기위해 도전해봅니다. 제일 처음으로 GDB 로 디버깅을 하여 강의할 프로그램은 다음과 같습니다. [gate@localhost tmp]$ cat t1.c #include int main(int argc, char *argv[]) { printf("%s ", argv[0]); printf("%s ", argv[1]); printf("%s ", argv[2]); printf("%s\n", argv[3]); return 0; } [gate@localhost tmp]$ ... 2011. 8. 17.
[IDA-Analysis] Binary Wargames Level1 안녕하세요, 이 게시판에서는 ELF 파일, 즉 바이너리 파일을 받아 C 언어로 소스화 하면서 모르는것은 알아가면서 필요한 키 값을 찾아가는 문제를 풀어가는 게시판입니다. 파일은 제공되지 않으며 만약 이렇게 분석을 하실 생각이라면 아이다 프로가 필요합니다. 이번 문제풀이의 목표는 본 파일에서 암호화를 하는데 똑같은 방법으로 "Deep into the system" 을 암호화해야 합니다. 단, UTC 2012년 12월12일 12시12분 12초 (24시간기준) 에 프로그램을 실행 했을 때의 암호화된 값을 적어야 한다. 무슨말이냐면 유닉스 시스템 용어로 타임스탬프라고 1970년 1월 1일 00:00:00를 기준으로 경과한 초를 의미하는데 이 점을 이용해 UTC 2012년 12월 12일 12시 12분 12초 에의.. 2011. 8. 17.
메모리 기본 구조 STACK_EBP EBP + 4 => RET EBP + 8 => argc EBP + 12 => argv[0] 2011. 8. 15.