CTF 스터디

    [pwnable.kr] 9번_ mistake 풀이

    [pwnable.kr] 9번_ mistake 풀이

    포너블 9번 mistake 문제를 풀어볼 것이다. 어떠한 실수를 저질렀다고 한다. 심각하게 생각하지 않아도 된다는 문구도 있다. 먼저 ssh로 접속을 해볼 것이다. ls를 해보니 mistake 실행파일과 코드파일, flag, password 파일이 있었다. mistake를 실행해보니 다음과 같이 나타났다. cat명령어를 통해 mistake 코드를 확인해보았다. 이 코드의 흐름은 다음과 같다. 사용자에게 pw_buf에 10바이트를 입력받아, 사용자가 pw_buf2에 10바이트를 입력받는다. 그리고 pw_buf2의 각 바이트에 1을 xor하고 pw_buf와 pw_buf2가 같으면 flag를 볼 수 있다. 총 10바이트의 길이인 pw_buf2에 각 바이트에 1을 xor한 값이 pw_buf의 각 바이트와 같아야..

    [pwnable.kr] 8번_ leg 풀이

    [pwnable.kr] 8번_ leg 풀이

    포너블 8번째 leg 문제에 대해 풀어볼 것이다. arm에 대해 배우다는 내용이 담겨있다. 먼저 ssh를 통해 접속을 해보았다. 부팅과 관련된 말들이 나타났고, ls를 해보니 leg라는 실행파일이 있었다. leg 파일을 실행해보니 "Daddy has very strong arm! :" 이라 뜨고 flag 값을 입력해주어야하는 구조이다. 다음은 leg.c 소스코드이다. int main(){ int key=0; printf("Daddy has very strong arm! : "); scanf("%d", &key); if( (key1()+key2()+key3()) == key ){ printf("Congratz!\n"); int fd = open("flag", O_RDONLY); char buf[100]; ..

    [pwnable.kr] 7번_input 풀이

    [pwnable.kr] 7번_input 풀이

    위의 ssh 쉘로 로그인하여 ls 명령어를 통해 어떤 파일들이 있는지 확인하였다. input 파일을 실행시켜보니 올바른 값을 요구하는 문구가 나타났다. input.c 파일을 출력해보니 이전 문제들보다 분량이 훨씬 긴 코드를 확인할 수 있었다. stage에 맞춰 하나하나 문제를 뜯어봐야한다. 먼저 Stage 1이다. argc는 arguments count (함수에 전달된 인자의 개수)를 뜻하고, argv는 arguments vector (가변적인 개수의 문자열) 을 뜻한다 argc = 100 argv[‘A’], 즉 argv[65] = \x00 argv[‘B’] = argv[66] = \x20\x0a\x0d 위의 조건을 만족해야한다. . 그 다음 Stage 2에서는 표준입력 : 0, 표준 출력 : 1, 표준..

    [pwnable.kr] 6번_random 풀이

    [pwnable.kr] 6번_random 풀이

    . 해당 ssh를 이용해 포너블로 접속해주었다. 어떤 파일이 있는지 확인하기 위해 ls -l 명령어를 통해 현재 파일들을 확인해보았다. flag 파일의 id가 random이기 때문에 이를 볼 수 있는 권한이 없는 상태이다. random이라는 실행파일이 존재하고, setuid가 random_pwn권한으로 되어있다. random elf로 random_pwn의 권한으로 flag의 내용을 볼 수 있을 것 같다. 여기서 elf란 Executable and Linkable Format, 또는 ELF. ELF는 유닉스 계열 운영체제의 실행, 오브젝트 파일, 공유 라이브러리, 또는 코어 덤프를 할 수 있게 하는 바이너리 파일이다. 간단히, 실행 파일이다. 원래 뜻은 Extensible Linking Format 이라는..

    [pwnable.kr] 5번_ passcode 풀이

    [pwnable.kr] 5번_ passcode 풀이

    포너블 5번_passcode 문제 풀이 화면의 ssh passcode 문제로 로그인을 해준다. 내용을 보면 컴파일되는 중에 컴파일 에러가 뜬 것 같다. passcode.c 파일을 출력하였다. 코드를 읽어보니 passcode1이 338150이고 passcode2가 13371337일 경우 플래그를 읽는다. 그런데 코드를 보면 scanf로 passcode 1,2 를 입력받는 부분을 보면 &연산자가 없다. 주소를 참조해서 변수에 값을 넣는게 scanf인데, 주소를 참조하지 않고 passcode1, passcode2라는 변수를 넣었기 때문에 이 값을 참조해 입력값을 받아온다. 이 부분에서 컴파일 경고가 뜬 것을 예상해 볼 수 있다. PLT(Procedure Linkage Table)과 GOT(Global Offs..

    [pwnable.kr] 4번_ flag 풀이

    [pwnable.kr] 4번_ flag 풀이

    포너블 4번_flag 문제 풀이 이번 문제를 포너블이 아니라 리버싱 문제같다. 바이너리 파일을 해결해야한다. wget 명령어를 통해 해당 url의 파일을 다운로드 받아준다. ls를 통해 무슨 파일이 있는지와 권한을 확인하였다. 아이다를 설치하고 겨우겨우 돌아왔다. ELF64 파일로 되어있고, 옆을 보면 UPX로 패킹되어있다는 것을 확인할 수 있었다. upx를 설치한 후, 다음과 같이 flag파일을 upx 디렉토리로 이동시켜주었다. 그리고 나서 파일을 unpacking 해주었다!! 언패킹한 flag파일을 gdb로 분석을 할 차례이다. flag 파일의 주소가 0x6c2070인 것을 확인 할 수 있다..드디어.. 다음과 같이 답을 확인할 수 있었다.