본문 바로가기

전체 글270

[어셈블리어 분석 실습] 기본 내용 이번 실습에서 어셈블리어는 AT&T 문법을 바탕으로 되어 있다. 기본적인 내용은 아래와 같으니 참고하자. .file "example1.c" # 디버거에서 사용하는 원본 파일 이름을 가리킴 (Intel 문법이 아니기 때문에 오른쪽 값을 왼쪽으로 넣음!!) .section .rodata # ./rodatd 섹션 정의, 이 섹션은 읽기 전용 데이터 변수 .text # text section. 코드들을장한 섹션/프로그램 코드 실행할 때 사용 .globl main # 전 코드에 걸쳐 접근 가능한 함수 .type main, @function # main 함수 정의. 이것을 해야만 global main 코드 얻을 수 있음 main: # main:~ret까지가 실제 코드 .LFB0: # 함수의 시작을 의미하는 'loc.. 2022. 5. 8.
[pwnable.kr] Toddler's Bottle - cmd2 이번에는 cmd1 문제를 이어 cmd2 문제를 풀어보았다. 대충 system command shell을 샀는데 필터 때문에 갖고 놀지 못한다는 것 같다. 이번에도 필터링 관련한 문제인 것 같다. 문제에 적혀있는 명령어로 접속해준다. 접속 완료했다. 파일 리스트는 이 정도 있다는 것을 확인한 뒤 cat으로 cmd2.c 내용을 살펴보았다. 먼저 main 함수를 살펴보았다. int main(int argc, char* argv[], char** envp){ delete_env(); putenv("PATH=/no_command_execution_until_you_become_a_hacker"); if(filter(argv[1])) return 0; printf("%s\n", argv[1]); system( ar.. 2022. 5. 7.
[pwnable.kr] Toddler's Bottle - cmd1 이번에는 cmd1 문제를 풀어보았다. 문제를 읽어보니 리눅스에서 PATH enviornment가 뭐냐고 묻고 있다. 아마도 이번 문제는 이와 관련한 문제인 것 같다. 아래에 적혀있는 명령어로 접속해준다. 접속 완료했다. 파일 리스트는 이 정도 있다는 것을 확인한 뒤 cmd1.c 파일의 내용을 살펴봤다. 먼저 main 함수를 살펴보았다. int main(int argc, char* argv[], char** envp){ putenv("PATH=/thankyouverymuch"); if(filter(argv[1])) return 0; system( argv[1] ); return 0; } 먼저, 낯선 함수 putenv를 살펴보았다. putenv는 환경변수의 내용을 수정하거나 추가하는데 사용된다. key=va.. 2022. 5. 7.
[pwnable.kr] Toddler's Bottle - bof 이번에는 bof 문제를 풀어보았다. 문제를 읽어보니 버퍼 오버플로우가 가장 흔한 소프트웨어 취약점이라고만 한다. 버퍼 오버플로우와 관련이 있는 문제라는 것만 알고 넘어가자. 문제에 있는 다운로드 링크를 통해, 바이너리와 c파일을 받아준다. 아래에 있는 nc 명령어는 나중에 거기로 접속해서 플래그를 획득하면 되니 일단은 넘어가자. 다운 받은 c파일을 열어 코드를 확인해보았다. #include #include #include void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme);// smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah.... 2022. 5. 7.
[Dreamhack Reverse Engineering] STAGE 4 [x86 Assembly] 1. 어셈블리 언어 1) 어셈블리 언어 - 컴퓨터의 기계어와 치환되는 언어 - CPU에 사용되는 ISA의 종류만큼 많은 수의 어셈블리어가 존재 ex. x64에는 x64의 어셈블리어 존재 2. x64 어셈블리 언어 1) 기본 구조 - 명령어 + 피연산자로 구성 - 명령어 : 동사에 해당 - 피연산자 : 목적어에 해당 - 예시 2) 명령어 데이터 이동 mov, lea 산술 연산 inc, dec, add, sub 논리 연산 and, or, xor, not 비교 cmp, test 분기 jmp, je, jg 스택 push, pop 프로시저 call, ret, leave 시스템 콜 syscall 3) 피연산자 - 상수, 레지스터, 메모리 - 메모리 피연산자는 []으로 둘러싸인 것으로 표현.. 2022. 5. 6.
[pwnable.kr] Toddler's Bottle - input 이번에는 input 문제를 풀어보았다. 그냥 컴퓨터 프로그램에 input을 어떻게 전달할 수 있냐고 물어보고 있다. 별 의미는 없는 것 같다. 아래에 있는 명령어를 통해 접속해준다. 접속 완료했다. 파일 리스트는 이 정도 있다는 것을 확인한 뒤 cat으로 input.c 내용을 살펴보았다. 너무 길어서 캡쳐보다는 코드를 긁어와서 아래에 가져왔다. #include #include #include #include #include int main(int argc, char* argv[], char* envp[]){ printf("Welcome to pwnable.kr\n"); printf("Let's see if you know how to give input to program\n"); printf("Just.. 2022. 5. 5.
[BOJ] 2022 SISS 1학기 스터디 - 3주차 # 4949 : 균형잡힌 세상 (Class 2 Silver 4) [문제] [코드 및 결과] import sys while True: str = sys.stdin.readline().rstrip() stack = [] check = 0 if str == ".": break for token in str: if token == "[" or token == "(": stack.append(token) elif token == "]": if len(stack) != 0 and stack[-1] == "[": stack.pop() else: check = 1 break elif token == ")": if len(stack) != 0 and stack[-1] == "(": stack.pop() else: che.. 2022. 5. 4.
[Dreamhack Reverse Engineering] STAGE 3 [Computer Architecture] 1. 컴퓨터 구조 1) 컴퓨터 구조 - 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고 이들을 구성하는 방법 - 컴퓨터 기능 구조에 대한 설계, 명령어 집합구조, 마이크로 아키텍처, 기타 하드웨어 및 컴퓨팅 방법에 대한 설계 포함 2) 컴퓨터 기능 구조에 대한 설계 - 효율적인 연산을 위해 컴퓨터에 필요한 기능들을 고민, 설계하는 분야 - ex. 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조 3) 명령어 집합구조(CPU 명령어에 대한 설계) - CPU가 처리해야하는 명령어 설계하는 분야 - ex. ARM, MIPS, AVR, 인텔의 x86 및 x86-64 등 2. 폰 노이만 구조 1) 컴퓨터의 핵심 기능 - 연산, 제어, 저장.. 2022. 4. 28.
[Dreamhack Reverse Engineering] STAGE 2 [Binary] 1. 프로그램과 컴파일 1) 프로그램 - 연산 장치가 수행해야 하는 동작을 정의한 일종의 문서 - 프로그램을 연산 장치에 전달하면, CPU는 적혀있는 명령들을 처리하여 프로그래머가 의도한 동작을 수행함 - 소프트웨어 개발자, 해커 등 많은 정보 분야의 엔지니어들이 프로그램을 '바이너리'라고 부름 Stored-Program Computer에서 프로그램이 저장 장치에 이진 형태로 저장되기 때문 2) 컴파일러 - 소스 코드 : CPU가 수행해야 할 명령들을 프로그래밍 언어로 작성한 것 - 컴파일 : 소스 코드를 컴퓨터가 이해할 수 있는 기계어의 형식으로 번역하는 것 - 컴파일러 : 컴파일을 해주는 소프트웨어 - 대표적인 컴파일러 : GCC, Clang, MSVC 3) 인터프리터 - 모든 언어가.. 2022. 4. 28.