[HackCTF] Yes or no
2021. 4. 16. 21:36
Wargame/HackCTF
문제 NX + ASLR 이 걸려있다. gets() 가 실행되도록 값을 입력 -> bof 를 발생시켜 ret 를 변경가능 현재 NX bit, ASLR 이 적용된 상황에서 주소가 leak 되지 않고 있다. -> 64 bit rop 기법을 통해 쉘을 얻을 수 있을 것이다. 두 가지 정도의 방법이 있다. 먼저 다음과 같이 기본적인 rop 기법을 이용하는 방법이다. 1. bss에 binsh 주입 2. put_got 주소를 leak 함 3. got overwrite 함 4. puts 실행함 아니면 rop 을 이용하되, leak 을 한 뒤에 다시 main 으로 돌아가면 굳이 got overwrite 없이도 쉘을 실행할 수 있다. 문제 해결 과정 주소를 leak 한 뒤에 main 으로 돌아가는 방법을 써보겠다. 필요한..
[HackCTF] poet
2021. 4. 16. 17:10
Wargame/HackCTF
1. 문제 NX 만이 걸려있다. 1. puts(s) : ******** 까지 출력 2. get_poem : enter -> 입력 3. get_author : 저자는 누구냐고 함 -> 입력 4. rate_poem : get_poem 에서 입력한 값에 따라 6024E0에 100 씩 더함 5. 6024E0 이 100000이면 반복문을 탈출함. 6. 반복문을 탈출하면 reward 함수가 실행됌. 우리의 목표는 reward 함수를 실행하는 것! 어떻게? 6024E0(bss 영역) 을 100000으로 만들기 2. 문제 해결 과정 get_poem() 에서 gets 를 입력받을 때 bof 가 발생 이를 이용해 값을 바꾸려고 했는데, 입력을 받은 뒤 6024E0을 초기화함 -> 안될 듯 get_author() 함수 역시..
[HackCTF] BOF_FIE
2021. 4. 15. 16:11
Wargame/HackCTF
1. 문제 NX, pie 가 걸려있다. welcome() 함수를 실행하고, puts 를 통해 멘트를 출력한다. welcome() 함수의 실제 주소를 leak 하고, scanf 를 통해 입력을 받는다. 입력을 받을 때 입력값을 검증하지 않아 bof 가 발생한다. flag 를 보여주는 함수로, 이 함수를 실행시키는 것이 최종 목표일 것이다. 예상되는 시나리오는 다음과 같다. 1. bof 를 통해 ret 를 j0n9hyun() 주소로 바꿔주면 된다. 2. 이때, pie 가 걸려있기에 pie_base 주소를 구해야 할 것이다. 3. welcome 주소를 통해 pie_base 주소를 얻으면 될 것이다. 2. 문제 해결 과정 v1 : ebp-0x12 0x12 = 18 offset = 18 + 4 따라서 payloa..
[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 시키면 될 것이다. 그렇다면 우선 입력값이 몇번째 포맷 스..