분류 전체보기
[HackCTF] Poet
check - 64bit - NX Analyze pseudo code - 초기화되지 않은 전역 변수 poem이 bss 영역에 1024byte만큼 할당되어있다. 이 때 poem의 값을 gets 함수로 읽어들이며 버퍼오버플로우 취약성이 발생한다. - dword_6024E0 변수는 점수라고 생각하면 되고, 매번 get_peom() 함수를 호출할 때마다 0으로 초기화한다. - poem을 dest에 복사한다. dest 변수는 0x410 byte만큼 할당되어 있다. - dest 에 "ESPR", "eat", "sleep", "pwn", "repeat", "CTF", "capture", "flag" 의 단어들이 포함되어 있을 때마다 100점의 포인트를 추가한다. - reward() 함수에 도달하기 위해서는 rate_..
[HackCTF] RTL_World
check - 32bit - NX만 걸려있다. Analyze pseudo 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax int v4; // [esp+10h] [ebp-90h] char buf; ..
[HackCTF] Yes or No
check - 64bit - NX 가 걸려있다 - 18.04에서 만들어진? 테스트된 문제라고 한다. Analyze pseudo code (IDA 사용) 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 int __cdecl main(int argc, const char **argv, const char **envp) { int v3; // eax int v4; // eax int v5; // ecx int v6; // eax int v7; // eax char s; // [rsp+Eh] [rbp-12..
[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 명령어를..