[HackCTF] ROP
2021. 4. 20. 02:23
Wargame/HackCTF
1. 문제 NX 가 걸려있다. 입력을 받고, Hello World! 를 출력한다. read() 입력 시 버퍼보다 더 입력받아 bof 가 발생한다. NX + ASLR 걸려있는 상황에서, 주소도 leak 되지 않음 -> ROP 2. 문제 해결 과정 기본적인 rop로도 풀 수 있지만, 이번엔 다음과 같이 풀어보았다. -> got 주소를 하나 leak 한 후 bof 가 터지는 vulnerable_function 으로 다시 돌아가서 leak 했던 주소를 통해 system, binsh 실제 주소를 구한 뒤 페이로드를 다시 보내는 방식 필요한 것들을 구해보자! pppr 가젯 offset : 0x88 + 4 = 140 3. 익스플로잇
[HackCTF] Gift
2021. 4. 19. 18:07
Wargame/HackCTF
1. 문제 nx가 걸려있다. 1. binsh, system 주소를 leak 한다. 2. fgets() 를 통해 입력받고, 입력받은 것을 출력한다. 3. gets() 를 통해 입력 받는데, bof 가 발생한다. binsh 의 주소는 고정되있고, system 의 주소는 바뀐다. binsh 의 주소는 아마 bss 영역일테고, system 은 실제 주소를 leak 해주는 것 같다. 처음엔 binsh 주소에 "/bin/sh" 이 실제로 들어가있는 줄 알고 익스를 했는데 잘 안되서 보니 binsh 위치에 아무 값도 들어있지 않았다. 아마 위치만 지정해준 것 같고, 저기다가 "/bin/sh" 을 넣어서 쓰라는 것 같다. 다음과 같이 실행하면 될 것 같다. 1. gets(&binsh) 2. system(binsh) 실..
[HackCTF] Look at me
2021. 4. 19. 15:37
Wargame/HackCTF
1. 문제 NX 가 걸려있다. system 함수를 쓰지 못할 것으로 보인다. 어쩐지 함수들이 굉장히 많았는데, 정적 링킹 되서 그런 거였다. gets() 입력 시 bof 가 발생한다. 현재, Nx + aslr 걸려있으며, 주소가 leak 되지 않고 있다. 그런데 정적 링크된 파일이라 system 함수를 이용할 수 없다. 이때 어떻게 쉘을 얻을 수 있을까? ->쉘코드를 bss 영역에 주입하고, mprotect() 함수를 통해 그 영역을 실행 가능하게 하면 된다. 2. 문제 해결 과정 1. gets() 통해 &bss 에 쉘코드 삽입 2. mprotect() 를 이용해 그 영역에 실행 권한 주기 구해야 될 것들 - bss 영역 - gadget - shellcode (x86 : 25byte) \x31\xc0\x..
[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..