gdb

    [ DoPwn ] Week1 - "system" Write Up

    shell 프로그램은 어떤 문자열을 입력하면 쉘의 ls -al 명령과 같은 응답을 출력하는 프로그램이다. 해당 파일이 있는 디렉토리의 응답과 일치하기 때문에 분명 프로그램 안에서 ls -al 명령을 실행하는 시스템 함수를 호출할 것임을 유추할 수 있다. 이 프로그램에서 입력은 gets 함수로 처리된다. c언어에서 gets는 입력받기 위해 사용되는 함수인데, 개행 앞 부분까지 잘라 char* 타입으로 마지막에 NULL을 붙여 저장해주는 함수라고 한다. 허나 버퍼 오버플로우를 발생시킬 수 있는 문제가 존재해 gets_s 함수의 사용을 권장한다고 한다. +) 참조 더보기 https://blockdmask.tistory.com/343 [C언어/C++] gets, puts 문자열 입출력 함수에 대해서. 안녕하세요..

    [ DoPwn ] Week1 - "Magic Spell" Write Up

    Magic Spell 프로그램은 주문을 입력받으면 해당 주문에 따라 정해진 명령을 실행하는 프로그램이다. 따라서 프로그램 안에는 주문을 비교하는 cmp 명령이 존재할 것 이라 유추한 뒤 접근했다. main 함수의 내용은 spell1 함수를 실행하는 것을 제외하고는 별 내용이 없었다. 따라서 spell1 함수의 내용을 함께 확인했다. spell1 함수에 예상한 바와 같이 비교하는 부분이 존재한다. 0x4d와 비교하는 것으로 보아, 문자열 "M"이 입력되면 같은 것으로 인식되어 아래에 jump가 되지 않고 spell2로 넘어갈 수 있음을 알 수 있다. 문자열 입력 직전을 보면, 0x7fffffffe4c0 위치, 즉 rsi에 입력받는 문자열에 들어감을 알 수 있다. 비교하는 부분은 rbp-1, 즉 입력받는곳보..

    [ DoPwn ] Week1 - "Student ID" Write Up

    student 프로그램은 이름을 입력받은 뒤 인사하고 학번을 출력하는 프로그램임을 실행과정을 통해 알아낼 수 있었다. 따라서 입력된 이름을 분석하는 코드가 존재할 것임을 예측할 수 있었다. 우선 프로그램의 정확한 구조를 확인하기 위해 gdb로 분석을 시도했다. pd main을 실행한 결과이다. main함수는 위와 같이 구성되어있으며, 앞서 예측한 바와 같이 0x401205 에서 입력받은 값을 비교하는 코드가 존재함을 확인할 수 있었다. 우선 비교대상의 값을 알아내면 쉽게 풀 수 있을 것 같아, 비교하는 대상의 주소값에 있는 문자열을 확인하는 시도를 했다. gdb가 메모리에 접근하지 못한다는 메세지와 함께 데이터 조회에 실패했다. 조금 고민한 뒤, 직접 값을 확인하는 대신 return 되는 위치를 변경하는..