ctf
-
hackctf_x64 Buffer Overflowctf/hackctf 2021. 12. 23. 15:55
아이다로 파일을 분석하면 main함수가 다음과 같이 나온다. 또 함수 목록을 보면 callMeMaybe라는 함수가 있다. 위와 같이 쉘을 실행시키는 함수이다. main에서 scanf함수로 입력을 받는데 입력 크기를 정하지 않았으니 bof 취약점이 발생 가능하다. 이 문제도 간단하게 rbp에서 0x110만큼 떨어진 공간을 아무 값으로 채우고 리턴 주소까지 총 16바이트(64비트에선 주소값이 8바이트) 떨어졌으니 그만큼 더 채운 다음 리턴 주소를 callMeMaybe함수의 주소로 덮어씌우는 것으로 풀면 된다. callMeMaybe함수의 주소는 0x400606이다. 위 코드를 실행하면 성공적으로 플래그를 얻을 수 있다.
-
hackctf_내 버퍼가 흘러넘친다!!!ctf/hackctf 2021. 12. 23. 15:45
아이다로 분석했을 때 main함수가 위와 같다. 다른 함수는 보이지 않고 심플하게 저것만 있는 문제다. name은 전역변수인 것 같고 read함수로 50바이트를 받는다. gets함수로 s에 값을 입력받는데 크기를 정하지 않으므로 bof가 발생할 수 있다. ebp에서 0x14만큼 떨어진 위치에 s변수가 있으니 총 24바이트를 채워서 리턴 주소를 바꾸면 되겠다. 쉘을 실행시키는 함수가 없으니 name변수에 쉘코드를 입력하고 리턴을 name의 주소로 하면 쉘을 딸 수 있을 것이다. 아이다로 name의 주소를 확인하니 0x804A060이다. 쉘코드는 32비트 25바이트 쉘코드를 쓸 것이다. "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x5..
-
hackctf_basic fsbctf/hackctf 2021. 12. 23. 15:36
아이다로 basic_fsb 파일을 분석해보면 다음과 같이 나온다. 변수 s가 ebp에서 0x808만큼 떨어져있다. 이를 10진수로 변환하면 2056이다. fgets함수로 s에 1024만큼 입력을 받으니 여기서 bof가 발생하지는 않는다. 바로 아래에 snprintf에서 변수 s의 내용 1024바이트를 format 변수로 출력하는 함수가 있다. 그리고 printf함수에서 format의 내용을 그대로 출력한다. 여기서 FSB 취약점이 발생한다. FSB는 Format String Bug의 약자로 printf에서 포맷스트링을 사용하지 않고 문자열을 그대로 출력할 때 발생한다. 문자열 s를 출력할 때 포맷스트링 없이 printf(s)이렇게 사용한다면 일반적인 경우 출력은 된다. 그런데 s의 내용이 "Hello W..
-
hackctf_basic bof#2ctf/hackctf 2021. 11. 8. 14:29
문제 파일을 먼저 gdb로 분석해보자. main+48에서 fgets 함수를 호출하고 그 전에 push되는 것을 보자 [ebp-0x8c]의 주소에 0x85즉 133바이트를 입력을 받는다. 더 위를 보면 [ebp-0xc]위치에 주소값이 들어간 것을 볼 수 있고, fgets 호출 이후를 보면 [ebp-0xc]에 들어갔던 주소를 호출하는 것이 보인다. [ebp-0xc]에 함수 주소를 넣고 fgets함수로 [ebp-0x8c]에 입력을 133바이트만큼 받은 후 [ebp-0xc]의 함수를 실행한다. 여기서 bof가 발생한다. 입력받는 주소와 함수 주소가 저장된 주소의 공간은 0x80만큼 차이나지만 입력을 0x85만큼 받는다. 즉 0x5바이트만큼 덮어쓸 수 있는 것이다. 프로그램에 존재하는 함수의 목록을 한 번 보자 ..
-
hackctf_basic bof#1ctf/hackctf 2021. 10. 4. 15:30
문제에서 제공한 파일을 다운로드 받으면 .elf파일이 다운 받아진다. 이를 gdb로 분석을 해보면 위 아래로 조금 더 있지만 크게 중요한 부분은 아니라 가운데만 캡쳐했다. gdb로 파일을 분석했을 때 주목할 함수가 2개 있다. fgets함수와 system함수이다. bof문제이기 때문에 fgets함수로 값을 받아오고 특정 조건 만족 시에 system함수로 shell을 실행시킬 것이다. 그럼 fgets로 얼마만큼 받아오고 어떤 조건을 만족해야하는가 보자 fgets부분을 보면 [ebp-0x34]위치에 0x2d byte만큼 입력값이 들어가는 것을 알 수 있다. 그리고 위로 올라가면 [ebp-0xc]위치에 0x4030201이라는 값이 들어가는 것이 보인다. 둘 사이의 공간은 0x34-0xc = 0x28 즉 40b..
-
ftz level3 문제 풀이ctf/ftz 2021. 8. 5. 20:48
level2에서 얻은 비밀번호를 이용해서 level3에 접속한다. ls로 디렉토리를 확인하고 cat으로 hint의 내용을 본다. hint의 내용을 확인하면 위와 같이 나온다. 즉 autodig라는 파일을 실행하면 위의 코드 내용대로 실행이 되며 이 코드가 어떻게 작동하는지 알면 된다. 코드를 보게 되면 cmd라는 문자열 변수를 선언한다. 100바이트 크기니까 문자열 길이는 크게 신경쓰지 않아도 될 것 같다. 위의 argc가 2가 아닌 경우 실행되는 내용은 중요하지 않으니 신경쓰지 않아도 되겠다. 핵심은 밑에 있는 str이 붙은 함수들이다. strcyp는 앞의 문자열에 뒤의 문자열을 복사하는 함수이다. 즉 cmd의 안에 "dig @"라는 문자를 집어넣는다. strcat은 앞의 문자열 뒤에 뒤의 문자열을 연..
-
ftz level2 문제 풀이ctf/ftz 2021. 8. 5. 11:27
level1에서 알아낸 level2 비밀번호로 level2에 접속한다. level1과 마찬가지로 ls로 디렉토리 확인 cat으로 hint를 본다. 텍스트 파일 편집 중 쉘의 명령을 실행시킬 수 있다. 이 말을 vi편집기로 쉘 명령어 실행이 가능하다는 소리이다. 당장 vi편집기를 켠 후 ':!ls'를 입력하면 ls명령어가 실행될 것이다. 일단 우리의 목표는 언제나 상위 권한의 쉘을 따는 것이다. 즉 level3 권한의 쉘을 얻어야 한다. 그러면 level1처럼 level3 권한의 파일을 찾아보자. 'find / -user level3 2>/dev/null' 위의 명령어를 입력한다. level1에서 썼던 명령어이니 굳이 설명은 하지 않겠다. 명령어를 입력하면 위와 같이 하나의 파일이 나오는 것을 알 수 있다..
-
ftz level1 문제 풀이ctf/ftz 2021. 8. 5. 11:10
본격적으로 ftz의 level1 문제를 풀어볼 것이다. level1은 id : level1 pw : level1이다. 이를 입력하고 접속하게 되면 다음과 같은 화면이 나온다면 접속에 성공한 것이다. 여기서 ls명령어로 현재 디렉토리에 뭐가 있는지 본다. hint라는 파일이 있어서 cat 명령어로 hint의 내용을 확인했다. level2권한에 setuid가 걸린 파일을 찾으라고 되어있다. 일단 level2권한의 파일을 찾아보자. find 명령어를 쓰면 된다. 'find / -user level2' 위의 명령어를 입력하면 되는데 만약 이대로 실행하면 조금 어렵다. 실행해보면 알겠지만 권한이 없다고 뜨는 파일이 많아서 그 중 우리가 사용 가능한 파일을 찾기가 힘들기 때문이다. 그래서 우리는 오류가 뜨는 파일은..