
[HackCTF] RTC
2021. 6. 1. 13:35
Wargame/HackCTF
문제 NX 가 걸려있다. 멘트를 출력하고, 입력을 받는다. buf 에 입력 시 bof 가 발생한다. nx, aslr 이 걸려있는 상황에서 rop 를 이용해 풀려고 했는데, 마땅한 가젯이 없다...! 이런 경우 RTC(return to csu) 기법으로 문제를 풀 수 있었다. __libc_csu_init() 함수로 리턴해 거기 있는 가젯들을 이용해 인자값을 레지스터에 저장하고 함수를 호출하여 주소를 leak 한 뒤, 다시 메인으로 돌아와서 bof 를 일으키면 된다. RTC 기법은 다음 블로그를 참고해 공부하였다. https://py0zz1.tistory.com/107 Return-to-Csu 기법 정리 포너블 문제를 풀 때, 64Bit 바이너리가 까다로운 이유가 바로 'Gadget' 때문이다. 64Bit의..

[HackCTF] World Best Encryption Tool
2021. 5. 29. 00:14
Wargame/HackCTF
문제 nx, canary 가 걸려있다. 버퍼 크기 이상으로 값을 넣으니 카나리 값 변조에 의해 프로그램이 종료된다. 1. src 에 입력을 받는다. (bof 발생) 2. src 배열 인덱스 0부터 49까지 xor 비트 연산을 한다. 3. dest에 src를 복사한다. (1바이트 만큼 조작 가능) 4. 계속할 지 안할지를 묻는다. 문제 해결 과정 src 에 bof 를 발생시켜 ret 를 변경하면 될 것이다. 그런데 카나리로 인해서 SFP 바로 전에 카나리 값이 들어가 있는 상황이다. -> 카나리 값을 빼와서 그걸 유지시키면서 익스플로잇 하면 될 것 같다. 카나리의 하위 1바이트가 null 값인 것을 이용해, strncpy 시 한 바이트 만큼을 조작하면 printf 를 통해 카나리 값까지 출력될 것이다. B..

[HackCTF] Unexploitable #2
2021. 5. 23. 20:31
Wargame/HackCTF
문제 NX 만이 걸려있다. unexploitable#1 처럼 입력을 받고 끝낸다. 다만 이번에는 함수이름 문자열 .dynstr 을 이용해서 sh 을 구하진 못할 것으로 보인다. fgets 입력 시 bof 가 발생한다. 이번엔 fflush 문자열이 존재하지 않기에 fgets를 통해 binsh을 bss영역에 넣거나 fwrite를 통해 주소를 leak 시키려고 했다. 그런데 마땅한 가젯을 쓸 수 없었다. 이때, system 함수를 통해 got 주소를 leak 할 수 있었다. system 함수 인자로 명령어가 아닌 것을 줬을 때 에러 메시지가 출력된다. 이를 이용해 system 함수 인자로 특정 libc 함수 주소를 주면, 에러 메시지가 출력되며 그 내용을 출력해줄 것이다. 이것을 leak 해서 libcBase..

[HackCTF] Unexploitable #1
2021. 5. 23. 18:56
Wargame/HackCTF
문제 NX 만이 걸려있다. 기본적인 RTL 문제인 것 같고, 실행을 하면 입력을 받고 끝낸다. 입력을 받을 때 bof 가 발생한다 -> ret 변경 가능 필요한 것들을 구해보자. system@plt system 함수의 plt 가 존재한다. "sh" 주소 binsh을 구해서 bss 영역에 넣자고 하니 상당히 귀찮아서, 위의 fflush 문자열을 구했다. "sh" 부분을 system 함수의 인자로 넘기면 될 것 같다. 알파벳 당 한바이트씩이니 sh 시작 주소는 4003BF 이다. 가젯 익스플로잇 system@plt 주소를 알고 있었고, "sh" 도 문자열을 통해 구할 수 있었기에 기본적인 RTL로 풀 수 있는 문제였다!

[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] Look at me (sysrop)
2021. 4. 23. 22:32
Wargame/HackCTF
1. 문제 haerinn.tistory.com/174 [HackCTF] Look at me 1. 문제 NX 가 걸려있다. system 함수를 쓰지 못할 것으로 보인다. 어쩐지 함수들이 굉장히 많았는데, 정적 링킹 되서 그런 거였다. gets() 입력 시 bof 가 발생한다. 현재, Nx + aslr 걸려있으며, 주소가 le haerinn.tistory.com 이 문제를 syscall 을 이용해 풀어보겠다. 현재, Nx + aslr 걸려있으며, 주소가 leak 되지 않고 있다. 그런데 정적 링크된 파일이라 system 함수를 이용할 수 없다. 이때 어떻게 쉘을 얻을 수 있을까? 1) bss 영역에 binsh 주입 - gets 통해서 2) execve(binsh) 시스템 콜 호출 rp++ 를 이용해 필요한 ..

[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의 마..