[HackCTF] Offset
2021. 4. 15. 15:30
Wargame/HackCTF
1. 문제 nx bit, pie 걸려있다. puts() 를 통해 출력을 하고, gets() 를 통해 입력을 받은 뒤 select_func() 함수를 실행한다. printf_flag 라는 함수가 존재한다. 이를 실행 시키는 것이 최종 목표일 것이다. strncpy 를 통해 dest에 복사를 하는데, 한 바이트만큼 오버플로우 발생한다. v3 -> 함수 포인터 만약에 v3에 print_flag 함수 주소를 넣으면??? v3 가 실행될 때 대신 print_flag 가 실행될 것이다. 2. 문제 해결 과정 그렇다면 v3, dest 의 위치를 알아보자. dest : ebp - 42 src : ebp - 12 offset : 30 인데, 현재 1바이트만큼 변조가 가능하다. 1바이트 만큼만 변조 가능한데, 어떻게 ov..
[HackCTF] RTL_Core
2021. 3. 31. 22:11
Wargame/HackCTF
1. 문제 NX 비트가 걸려있음을 알 수 있다. 처음에 gets 함수를 통해 입력을 받는데, 입력받은 것을 check_passcode() 인자로 넘겨서 반환되는 값이 hashcode와 같을 경우 core() 함수를 실행한다. gets로 받은 인자(a1)를 반복문을 돌리는데, for 문을 통해 a1에 4씩 더하면서 4바이트 포인터로 형변환을 해준다. 그래서 a1부터 a1+16까지의 값을 누적시킨 v2를 반환해준다. (즉, for 문을 5번 반복하면서 전달받은 주소값을 기준으로 4bytes 씩 증가시켜 순차적으로 접근하여 해당 값들을 v2 변수에 더하여 반환한다.) 이때, v2는 hashcode의 값( 0xC0D9B0A7 ) 과 같아야 한다. 값을 같게 할 방법은 두 가지 정도 있다. 1) hashcode ..
[HackCTF] RTL_World
2021. 3. 20. 20:19
Wargame/HackCTF
1. 문제 파일을 실행시키니 뭐가 굉장히 많이 나왔다. 일단 1번을 클릭하자, 문제에 적용된 보호기법들이 나왔다. NX bit가 적용된 것으로 보아 스택에 쉘을 넣어 실행하지는 못할 것으로 보인다. 그리고 2,3,4 번은 돈(Gold)과 관련된 것들이었다. 이번엔 ida로 파일을 열어보았다. 메뉴 선택 > switch문 별로 나눠지는 것 같다. 그 중에서도 case 5(Attack)에 해당하는 것이 눈에 띄었다. buf에 0x400u 즉, 1024 byte 만큼 입력을 받고 있는데, buf의 크기는 고작 128 byte이다. 따라서 bof를 일으켜 RET 값을 변경할 수 있을 것이다. 그런데, NX 보호 기법이 적용되어있기에 그것을 우회하기 위해 실행 가능한 영역에 있는 코드 즉, 외부 라이브러리 함수를..
[HackCTF] x64 Simple_size_BOF
2021. 3. 19. 23:34
Wargame/HackCTF
1. 문제 의도 파악 파일을 한번 실행시켜보았다. 오 자살방지 문제라니.. 쉽나보다 다행.... printf 함수를 통해 v4의 주소가 leak 되고 있다. 나중에 써먹으면 될 듯하다. 그리고 gets 함수로 입력을 받아 v4 버퍼에 저장하는데, gets 함수는 입력값을 검증하지 않기에 bof를 일으켜 RET 값을 변경할 수 있을 것이다. 2. Offset 구하기 main의 스택 프레임은 위와 같다. v4의 시작주소는 RBP-0x6D30이므로, RBP로부터 27952 Byte 만큼 떨어져있다. -> offset은 (27952 + 8)이다. 따라서 버퍼에 shellcode를 넣고 RET 전까지를 dummy 값으로 채운 뒤 RET에 v4의 시작 주소를 넣으면 될 듯하다. payload는 다음과 같을 것이다...
[HackCTF] Basic_FSB
2021. 3. 19. 21:46
Wargame/HackCTF
1. 문제 의도 파악하기 버퍼 s에 입력을 받은 뒤, snprintf 함수를 통해 format에 s를 저장한다. 그런데 이때, 서식지정자를 지정하지 않고 바로 s를 저장하기에 FSB 취약점이 발생한다. 그렇다면 이걸로 뭘 할 수 있을까? 바로 FSB 취약점을 이용해 특정 메모리 주소에 뭔가를 쓰거나 읽을 수 있다. 그리고 우리의 목표는 아마 flag 함수를 실행 시키는 것이다. 따라서 FSB를 이용해 특정 메모리 주소에 flag 함수 주소를 overwrite 시켜 flag 함수를 실행시키면 될 것이다. 이때 snprintf 함수 다음에 printf가 실행된다. 그래서 printf_got에 "%n"을 이용하여 flag 함수 주소를 overwrite 시키면 될 것이다. 그렇다면 우선 입력값이 몇번째 포맷 스..
[HackCTF] Basic_Bof #2
2021. 3. 19. 21:40
Wargame/HackCTF
1. 문제 의도 파악하기 v5는 함수 포인터로, sup 함수의 메모리 주소가 담겨있다. sup 함수는 s를 출력해 반환하는 함수이다. 그리고 gets 함수로 입력을 받아 버퍼 s에 저장하는데, 버퍼의 크기인 128 byte보다 큰 133만큼 입력을 받아 bof를 발생시킬 수 있을 것으로 보인다. 다만, 133byte 로는 RET까지 가지 못하므로 return address를 변경하는 것은 아닐 듯 싶다. 이때 함수들을 살펴보니 /bin/dash를 실행하는 shell 함수가 존재한다. 그래서 아마 버퍼 크기인 128만큼을 dummy 값으로 채우고, 그 뒤에 있는 v5에 shell의 주소를 넣으면 될 것으로 보인다. 즉, payload는 다음과 같을 것이다. payload = "A"*128 + shell 함..
[HackCTF] Basic_Bof - Simple_Overflow_ver_2
2021. 3. 13. 23:57
Wargame/HackCTF
1. 문제 1. 먼저 데이터 입력을 받는다. 2. buf 의 주소를 출력하고 입력받은 데이터도 출력한다. 3. 다시 실행할 건지 묻는다. 4. y를 입력하면 다시 데이터를 입력받게 되고, 동일한 주소를 출력한다. 5. 프로그램을 종료하고 다시 실행시키면 버퍼의 주소가 다르게 나온다. 2. 문제 의도 파악하기 scanf 입력 시 입력값 검증을 하지 않기에 bof를 일으켜 RET를 변경하면 될 것 같다. 즉 payload는 다음과 같을 것이다. Payload = "Shell code" + dummy 값 + buf의 주소 그리고 프로그램이 실행될 때 buf의 주소가 leak이 되기 때문에 exploit 코드에서 구해서 전달하면 될 것이다. 그렇다면 이제 offset을 구해서 중간에 그만큼의 dummy 값을 주..
[HackCTF] Basic_Bof - 내 버퍼가 흘러넘친다!!!
2021. 3. 11. 15:36
Wargame/HackCTF
1. 문제 의도 파악 지금 read와 gets 함수로 입력을 두 번 받고 있다. 그리고 gets 함수의 경우, 입력값 검증을 하지 않기에 buffer 크기인 20보다 더 크게 넣어 return address를 바꿀 수 있을 것이다. 그래서 쉘 코드를 어디에 넣을까 생각하다가, read 함수로 입력을 받는 name에 쉘 코드를 삽입하고 버퍼 s에 더미값과 name의 시작 주소를 넣어 쉘코드를 실행해보려 한다. 2. offset 구하기 name의 경우 50byte만큼 입력을 받는다. 따라서 쉘코드를 넣고 그 앞 뒤에 nop을 채워주면 될 것으로 생각된다. 그런데, 이때 name은 bss 영역이기 때문에 ASLR의 영향을 받지 않는다. 따라서 nop을 주지 않고, 쉘코드만 채워도 된다는 결론이 나온다. 그리고..