
[HackCTF] UAF
2021. 5. 8. 18:19
Wargame/HackCTF
1. 문제 canary, nx 가 켜져있다. 메뉴 화면이 나오고, 1~4번까지 선택지가 주어진다. 각 선택지에 따라 다른 함수들이 실행된다. main 함수 v3에 저장된 값에 따라 각 함수들이 실행된다. add_note() 함수 먼저 notelist 배열 값이 비어있는지 확인한다. notelist 란 전역에 선언된 배열로써 최대 5개의 노트까지 추가할 수 있다. add_note() 에서는 총 두 번 malloc()이 호출된다. - print_note_content 라는 함수 포인터 저장을 위해 - 실제 데이터를 저장하기 위해 0x804c008 : 함수 포인터가 저장되어 있다. 0x804c018 : 입력한 데이터가 저장되어 있다. del_note() 함수 add_note() 를 하면 notelist 의 배..

[HackCTF] Beginner_Heap
2021. 5. 8. 16:20
Wargame/HackCTF
1. 문제 입력을 두 번 받고 끝낸다. 총 네 번 malloc 을 할당한다. 1. v3에 16 공간 할당 2. v3+1에 8 공간 할당 3. v4에 16 공간 할당 4. v4+1에 8 공간 할당 5. s라는 변수에 최대 0x1000의 크기의 값을 입력받고 v3+1에 저장 6. s라는 변수에 최대 0x1000의 크기의 값을 입력받고 v4+1에 저장 이 부분에서 strcpy 시 overflow 가 두 번 발생한다. sub_400826 함수를 실행시키는 것이 목적일 것이다. 2. 문제 해결 과정 1 (v3이 가르키는 힙영역) malloc(8) 할당한 주소가 담김 malloc(8) 실제 주소 2 (v4가 가르키는 힙영역) malloc(8) 할당한 주소가 담김 v4+1에 입력을 받으니 v4+1이 가르키는 0x60..

[HackCTF] SysROP
2021. 4. 23. 18:12
Wargame/HackCTF
1. 문제 read 로 입력을 받을 때 bof 가 발생한다. NX 만 걸려있다. nx + aslr 이 걸려있는 상황에서 leak X -> 64bit rop 를 하려고 했으나, leak 을 할 수 없는 상황이었다. puts 나 printf 등의 출력함수가 없기 때문이다. 이럴 땐 어떻게 해야 할까? syscall rop = system call rop 을 이용해서 풀어준다. 2. 문제 해결 과정 rax : 0x3b rdi : data rsi : 0 rdx : 0 필요한 것들을 구해보자. 1) Gadget 2. 고정 주소 (data 영역) bss 영역은 stdout 으로 쓰여서 data 영역에 저장해줌. 함수들의 하위 3바이트는 offset 을 나타내며, 항상 일정하다는 점을 이용 -> read_got의 마..

[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. 익스플로잇