ctf/hackctf
-
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..