목록읭? (68)
R4mbb

FSB 공부를 하며 FSB에 관한 문제를 더 풀어보고 정리하고 싶어서 메모에다가 남긴다. 먼저, 파일을 다운받고 IDA로 열어서 코드를 확인해보자. main함수에 printf(&buf) 부분에서 FSB 취약점이 터지는걸 확인할 수 있다. 함수를 살펴보면, hide라고 아주 수상하게 생긴 함수가 존재한다. hide 함수를 이용해서 해결하면 될 것 같다. 우분투에서 한번 실행해보자. 처음 입력한 AAAA가 포맷 스트링을 입력한 후로 4번째에 hex 값으로 출력이 되었다. 그렇다면, 순서는 이렇다. 1. read 함수로 입력을 받을 때 앞 부분에 exit 함수의 GOT 주소를 넣어준다. 2. %hn (%n)을 활용해서 처음에 넣은 exit_GOT 주소위치에 hide 함수의 주소를 넣도록 조작한다. ※ %hn은..

먼저 파일을 윈도우와 우분투에 받자. 그리고 IDA로 디스어셈해보자. 문제의 이름이 BOF인 만큼 fgets() 함수에서 입력받는 과정에서 버퍼 사이즈를 잘 못 지정해서 취약점이 발생한 것 같다. fgets() 함수에 대해 알아보자. fgets(char * str, int num, FILE * stream) - 첫 번째 인자는 읽어들인 문자열을 저장할 char 배열을 가리키는 포인터이다. - 두 번재 인자는 마지막 NULL문자를 포함하여 읽어들일 최대 문자 수이다. - 세 번재 인자는 문자열을 읽어들일 스트림의 FILE 객체를 가리키는 포인터이다. - 리턴값은 성공했을 경우 char 배열을 리턴하고 아무런 문자가 없거나 오류가 발생했을 때는 NULL이 리턴된다. shell() 함수가 존재한다. gdb로 ..

Format String Bug (FSB) : printf() 함수 계열을 사용할 때, 인자로 포맷 스트링과 포맷 스트링에 대응하는 인자를 사용하지 않고 바로 변수를 인자로 지정했을 때, 악의적인 공격자가 포맷 스트링을 입력하여 스택의 값을 leak 하거나, RET나 _DTOR_END__, GOT와 같은 프로그램의 흐름을 제어할 수 있는 메모리 주소값을 변조하여 악의적인 행동을 할 수 있게 된다. 윈도우와 우분투에 파일을 다운받고 IDA로 코드를 확인해보자. 메인함수에선 따로 확인할건 없어보인다. vuln 함수를보자. snprintf 함수와 printf 함수에서 서식문자를 따로 지정해주지 않고 바로 넘겨버린다. 이 함수에서 FSB 취약점이 발생한다는 것을 알 수 있다. 두 함수에 대해 알아보자. spri..

문제를 보니 파일에서 플래그를 찾으라고 한다. 힌트는 파일의 헤더를 고쳐야한다고 한다. 일단 Hxd로 열어보자. Header Signature를 보니 뭔지 잘 모르겠다. file signature 모음은 (forensic-proof.com/archives/300) 여기서 확인해보자. Footer Signature를 확인 해보자. footer를 보니 png 파일의 footer signature 였다. 헤더를 수정하고 확장자를 바꾼 뒤에 실행해보자. 아직 실행되지 않는다. 자세히보니 png 파일 헤더 청크에 문제가 있어 보인다. png 파일 구조에 대해 알아보자. File Signature (8 byte) { Length (4 byte), Chunk Type (4 byte), Chunk Data (lengt..

금고문 문제가 또 나왔다. 소스를 분석해보자. import java.util.*; class VaultDoor3 { public static void main(String args[]) { VaultDoor3 vaultDoor = new VaultDoor3(); Scanner scanner = new Scanner(System.in); System.out.print("Enter vault password: "); String userInput = scanner.next(); String input = userInput.substring("picoCTF{".length(),userInput.length()-1); if (vaultDoor.checkPassword(input)) { System.out.pri..

문제를 보니 picobrowser로 플래그를 찾을 수 있다고 한다. 찾아보자. 플래그 버튼을 누르니 picobrowser가 아니라고 한다. burp suite를 사용해 picobrowser로 접속을 해보자. User-Agent를 picobrowser로 바꿔 주면 될 것 같다. 바꿔서 계속 Request를 보내보자. 플래그가 나왔다. 플래그는 picoCTF{p1c0_s3cr3t_ag3nt_e9b160d0} 이다.

문제를 보니 프로그램 출력을 유지하고 플래그를 검색하라고 한다. 힌트에는 파이프를 사용하라고 한다. 먼저 실행해보자. nc로 접속해보니 이상한 것들이 출력된다. 파이프로 플래그를 골라내보자. 플래그가 나왔다. 플래그는 picoCTF{digital_plumb3r_06e9d954} 이다.

문제를 보니 2진수 또는 16진수를 데이터 인코딩을 이해하라고 한다. 주소에 접속해보자. 45초 안에 2진수를 단어로 변환하라는 것 같다. python 코드를 짜서 변환해보자. import sys for i in "01101110 01110101 01110010 01110011 01100101".split(" "): sys.stdout.write(chr(int(i,2))) 실행을 해주자. nurse이 나왔다. 이번엔 8진수인 것 같다. 마찬가지로 python 코드로 변환해주자. import sys for i in "154 141 155 160".split(" "): sys.stdout.write(chr(int(i,8))) lamp가 나왔다. 16진수를 변환 해주자. import sys for i in "..