[HackCTF] Random Key
2021. 4. 19. 01:17
Wargame/HackCTF
1. 문제 NX bit 가 걸려있다. flag 함수를 실행하기 위해선 우리가 입력한 값과 random 하게 만들어진 값이 같아야만 한다.... 음............. 어떻게 같게 할 수 있을까?? pwnable.kr 풀었을 때는 srand() 함수가 없어서 rand() 결과로 나오는 난수가 일정한 값이였지만, 여기서는 seed 값이 계속 변해서 다른 난수가 계속 생성된다. 따라서 생성되는 난수와 같게 해주려면 아무래도 직접 난수를 만들어야 할 것 같다. 2. 익스플로잇 난수를 생성하는 간단한 프로그램을 만들어서, 리눅스 ';' 파이프 명령을 통해 난수 생성 프로그램과 서버 접속을 동시에 하므로써, 똑같은 난수를 생성하도록 하였다.
[HackCTF] 1996
2021. 4. 18. 20:27
Wargame/HackCTF
1. 문제 NX bit 가 걸려있다. 1. "어떤 환경 변수를 읽고 싶니?" 멘트를 출력한다. 2. name 버퍼에 입력을 받는다. 3. getev() 함수를 통해 입력받은 환경변수의 값을 읽어온다. 처음에는 환경 변수 문제인 줄 알고, 엄청 고민했었는데 아니었다!! 최종 목표는 spawn_shell 함수를 실행하는 것일 것이다. 그리고 앞에서 name 에 std cin 으로 입력을 받을 때 크기를 지정하지 않기에 bof 를 일으킬 수 있다. 따라서 ret 값을 spawn_shell() 시작 주소로 변경해주면 될 것 같다. (spawn_shell 은 코드 영역에 존재하므로 ASLR의 영향을 받지 않음 -> 고정된 주소) 2. 익스플로잇
[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..
[FTZ] 해커스쿨 FTZ level 19
2021. 4. 13. 23:31
Wargame/Hackerschool FTZ
1. 문제 소스코드가 상당히 심플하다. gets() 를 통해 입력을 받고, printf() 를 통해 입력 받은 것을 출력한다. 그런데 gets 를 통해서 입력을 받을 때, 입력값 검증을 하지 않기에 bof 가 발생한다. 따라서 ret를 변경해주면 될 것 같다. 1. 환경 변수에 등록한 걸 이용 2. nop을 줘서 풀어도 될 듯함. 이번엔 환경 변수를 이용해 풀어보겠다. 이때, 코드에 권한을 상승하는 부분이 없기에 setruid 함수를 포함하는 41byte shellcode 를 환경변수에 등록해줘야한다. 2. 문제 해결 과정 환경 변수를 등록할 때 앞에 nop을 적당히 주는 것을 추천한다! 처음에 nop 을 주지 않았는데, 쉘이 잘 따지지 않았다. 컴파일 한 후 실행하면 환경 변수의 주소가 출력된다. 페이..
[FTZ] 해커스쿨 FTZ level 18
2021. 4. 13. 22:59
Wargame/Hackerschool FTZ
1. 문제 Hint 를 확인하니 다음과 같은 소스코드가 들어있었다. #include #include #include #include void shellout(void); int main() { char string[100]; int check; int x = 0; int count = 0; fd_set fds; printf("Enter your command: "); fflush(stdout); while(1) { if(count >= 100) printf("what are you trying to do?\n"); if(check == 0xdeadbeef) shellout(); else { FD_ZERO(&fds); FD_SET(STDIN_FILENO,&fds); if(select(FD_SETSIZE, ..