System

    [HackCTF] BOF_PIE

    check - 32 bit - NX와 PIE가 설정되어 있다 >> Analyze pseudo code - v1에 ebp로부터 0x12 byte 떨어진 곳에 할당하고 scanf("%s")를 통해 v1의 값을 읽어들인다. 이 때 스택 버퍼 오버플로우 취약성이 발생한다. - welcome 함수의 주소를 출력한다. - 아무래도 이 문제의 목표는 Return address를 j0n9hyun으로 하여 플래그를 따는 것 같다! - welcome 함수의 주소가 매번 출력되기 때문에 그 값을 읽어들이고, j0n9hyun과 welcome의 offset은 항상 같으므로 둘의 차(0x909 - 0x890)를 이용해 j0n9hyun함수를 Return address로 덮는다. 실행 Exploit from pwn import * ..

    [HackCTF] BASIC_FSB

    check - 32bit - 딱히 보호기법이 적용되어 있지는 않다. Analyze pseudo code - fgets 함수를 통해 문자열 s에 표준입력으로 1024byte만큼 입력받고, s에 저장된 값을 0x400byte만큼 format에 저장한다. 그리고 printf에 format을 통째로 집어넣으면서 FSB가 발생한다. - format의 주소를 찾아야겠다! - format에서 발생하는 FSB를 이용해 printf의 got 주소를 flag의 주소로 덮는다. - flag 함수의 주소는 0x80485b4 = 134514100 실행 입력한 데이터가 첫번째 포맷스트링x부터 차례로 쓰여지는 것을 확인할 수 있다. Exploit printf@got 주소 4byte의 영향을 받기 때문에 flag 함수의 주소에서 4..

    FSB (Format String Bug)

    dreamhack.io/learn/3#23 dreamhack FSB 강의를 수강하며 정리한 내용이다ヽ(✿゚▽゚)ノ FSB (Format String Bug) printf()나 sprintf()처럼 포맷 스트링을 사용하는 함수에서 사용자가 포맷 스트링 문자열을 통제할 수 있을 때 발생하는 취약점; 프로그래머가 지정한 문자열이 아닌 사용자의 입력이 포맷 스트링으로 전달될 때 발생하는 취약점이다. 프로그램내에 이 취약점이 있으면 프로그램의 임의의 주소의 값을 읽고 쓸 수 있기 때문에 아주 위험하다. 포맷 스트링을 사용하는 대표적 함수들 printf sprintf / snprintf fprintf vprintf / vfprintf vsprintf / vsnprintf 포맷 스트링의 종류 % : "%"문자를 출력..

    [HackCTF] Simple_Overflow_ver_2

    check - 32bit - 바로 앞의 문제와 같이 별다른 보호기법은 적용되어 있지않다. Analyze pseudo code 실행 - v5는 Again(y/n)에 대한 답을 저장하는 변수로, v5의 값이 121 또는 89인 동안 데이터를 입력받는 반복문이 지속된다. 이 때 121과 89는 각각 Y, y의 10진수값이다. - v5는 ebp로부터 0x89byte떨어진 곳에 위치하고 scanf 함수를 통해 값을 입력받는다. 이 때 scanf에서 몇 바이트를 입력받는지 정해두지 않았기 때문에 버퍼 오버플로우가 발생할 수 있다. >> scanf("%c")로 문자를 입력받기 때문에 overflow 시키기에 적합하지 않다. - 데이터는 s에 저장되고 16개씩 끊어 "주소: 값"이 출력되도록한다. >> 쉘코드를 s에 ..

    [HackCTF] x64 Simple_size_BOF

    check - 64bit - Partial RELRO - 보호기법이 (RELRO빼고) 적용되어 있지않다 Analyze pseudo code - 스택 버퍼 v4는 rbp로부터 0x6d30 byte 떨어진 곳에 위치한다. 스택 버퍼 v4의 주소를 출력하고 gets 함수를 통해 입력받는다 >> 버퍼 오버플로우가 발생할 수 있다. 실행 Exploit 우선 buf의 주소를 출력해주니까 이를 잘 읽어내야한다! LOB 문제 풀 때처럼 쉘코드를 버퍼에 넣고 BUF[0x6d30]+SFP[8] - len(쉘코드) 만큼 dummy값을 채워줘 버퍼 오버플로우를 일으키고 RET주소로 buf의 주소값을 전달해 버퍼에 저장한 쉘코드를 실행시키도록 한다. from pwn import * #context.log_level = 'deb..

    리눅스 기초 명령어-사용자 권한

    사용자 변환 - su / sudo su 사용자* 원하는 사용자로 다시 로그인한다. 사용자를 따로 지정해주지 않고 su 만 하면 root 사용자로 로그인된다. sudo 명령어 root 사용자의 권한으로 뒤의 명령어를 실행한다. >> 이 두 명령을 사용할 때는 변경하려는 사용자/root의 비밀번호를 입력해야한다! 사용자 권한(permission mode) 리눅스 시스템이 다중 사용자 시스템(multi-user system)이기 때문에 필요한 개념이다. r(읽기) : 해당 파일을 읽을 수 있는 권한 w(쓰기) : 디렉터리 내에 파일을 생성하거나 편집, 삭제할 수 있는 권한 x(실행) : 디렉터리 내에서 탐색을 위해 이동할 수 있는 권한, 이진 파일(실행 파일)의 경우 실행할 수 있는 권한 doongdangdo..

    리눅스 기초 명령어

    현재 경로명 - pwd pwd 현재 디렉터리의 절대 경로명을 출력한다. 시스템 정보 확인 - hostname / uname hostname 시스템의 이름을 확인하고 바꾼다. uname 시스템의 이름(커널)을 출력한다. -a 옵션을 붙여 커널명, 호스트명, 커널 릴리즈, 버전, 머신, 프로세스, 하드웨어 플랫폼, 운영체제를 출력한다. 패스워드 변경 - passwd passwd 사용했던 명령어 확인 - history history [N] [옵션] 사용자가 리눅스 커널에서 사용했던 명령어들의 리스트를 시간순으로 출력한다. history 명령어 뒤에 숫자를 입력하면 최근에 사용한 N개의 명령어들만 출력한다. [옵션] -r : 가장 최근에 사용한 명령어부터 역순으로 출력한다. 이럴 때 head나 tail 명령어를..

    리눅스 기초 명령어-파일, 디렉터리

    파일의 종류 리눅스는 "/"(root)를 기준으로 그 하위 디렉터리에 usr, var, bin 등의 디렉터리가 있고, 또 그 아래에 다양한 디렉터리들과 파일들이 존재하는 트리 형태의 계층 구조를 가진다. 일반 파일 (ordinary file) 데이터를 가지며 디스크에 저장되는 파일이다. ▷ 텍스트파일, 이진 파일(binary file) 디렉터리 (directory file) 파일들을 계층적으로 조직화하여 사용하는 일종의 특수 파일로, 윈도우에서의 폴더 개념으로 생각하면 된다. 디렉터리 내에 여러 파일이과 서브(하위) 디렉터리들이 존재한다. ▷ ~(홈디렉터리), .(현재 디렉터리), ..(상위 디렉터리) 장치 파일 (device special file) 시스템에 설치된 여러 하드웨어 장치를 파일화 한 것이..

    [HackCTF] x64 Buffer Overflow

    check - 64bit - NX만 설정되어 있음 >> 단순한 return address 변조로 풀 수 있을 것! Analyze pseudo code - 스택 버퍼로 s를 만들고 ebp로부터 0x110byte 떨어진 곳에 위치한다. 그리고 scanf 함수를 통해 입력받는다. 이 때 입력받는 크기를 특정하지않기 때문에 Buffer Overflow가 발생할 수 있다. - 변수 v5에는 문자열 s의 길이가 저장된다. - 수상한 함수인 callMeMaybe.. - 이 함수를 RET 값으로 주면 execve("/bin/bash")가 실행되어 쉘을 딸 수 있을 것 같다. Exploit from pwn import * p=remote("ctf.j0n9hyun.xyz", 3004) pl="A"*(0x110) pl+="..

    [LOB] orc → wolfman

    $ bash2 $ ulimit -c unlimited $ mkdir tmp $ cd wolfman tmp/wolfman Analyze source code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 /* The Lord of the BOF : The Fellowship of the BOF - wolfman - egghunter + buffer hunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc > BUF[40]+SFP..