Level9에서 얻은 패스워드를 이용해 level10으로 로그인하면 hint 파일과 program 디렉터리가 존재한다. hint 파일을 cat 명령어로 읽어보니 공유 메모리(key_t : 7530)를 이용해 두 명의 사용자가 대화를 나누고 있는데, 주어진 키 값을 이용해 대화를 도청한 후 권한을 얻는 것이 목적이다. 처음에는 리눅스 공유 메모리의 존재를 몰랐기에 level10 폴더에 존재하는 program 디렉터리에 들어가려 하거나, find 명령어로 level11로 Setuid가 걸린 파일을 찾았다. 하지만 보이지 않았고, 몇 번 삽질을 하다 힌트에 나와있던 공유 메모리를 구글링해봤다. 공유 메모리란 여러 프로그램이 사용할 수 있는 메모리로, key 값을 통해 메모리를 읽을 수 있다. #include ..
분류 전체보기
보호되어 있는 글입니다.
보호되어 있는 글입니다.
이번에 풀이할 문제는 HackCTF의 Yes or no 문제로 x64 rop 공격이 쓰이는 문제인데, 풀 당시에는 x64 rop뿐만 아니라 x86 rop 공격에도 무지했기 때문에 시간이 많이 소요됐다. (포스팅이 많이 늦은 이유기도 하다.) 문제 파일은 다른 문제들과 달리 binary 파일과 libc-2.27.so가 있다. libc-2.27.so 파일은 문제 서버와 로컬 서버의 libc base 주소가 다르기 때문에, 이 파일을 참고해 서버 libc base address 기준으로 exploit 할 수 있도록 하는 것이다. 문제 파일을 실행하기 전 보호기법을 확인해봤다. NX가 걸려 있어 쉘 코드를 삽입할 수 없고 64bit 파일인 것을 알 수 있다. stack canary가 없는 것을 봐서 추측할 수 ..
최근 rop 공격을 공부하면서 난항을 겪었다. #include int main(void) { char buf[32] = {}; puts("Hello World!"); puts("Hello ASLR!"); scanf("%s", buf); return 0; } gcc -o example4 example4.c -fno-stack-protector -mpreferred-stack-boundary=2 -m32 -no-pie rop 공격을 테스트하기 위해, 위 c언어 소스 코드를 아래 gcc 명령어를 이용해 실습에 방해되는 보호 기법을 해제해준 상태로 빌드를 했다. 빌드 후 gdb로 파일을 열어 scanf 함수의 plt 코드를 확인해보면 정상적인 plt 코드가 아니라, endbr32 같은 이상한 명령어들이 보이는 ..
이번에 풀이할 문제는 HackCTF의 BOF_PIE 문제다. 문제 명만 봤을 때는 pie 보호 기법이 걸린 상태로 bof 공격을 해야 할 것 같다. 마찬가지로 bof_pie라는 이름의 elf 파일이 주어져 있으니, 동작 확인 -> 보호 기법 확인 -> 코드 확인 순서로 풀이를 진행하겠다. 문제 파일을 실행하면 "Hello, Do you know j0n9hyun?"과 "j0n9hyun is 0x56555909"라는 알 수 없는 16진수 값이 출력된 후 입력을 받는다. 입력 값으로 1을 주니 "Nah ..."가 출력됐다. 보호 기법을 확인해보니 NX bit와 문제 이름처럼 PIE 보호 기법이 걸려 있는 것을 볼 수 있다. main 함수는 welcome 함수를 호출한 뒤 "Nah..."를 출력해준 뒤 종료된다..
이번에 풀이할 문제는 HackCTF의 Offset 문제다. 개인적으로 이번 문제는 푸는 방법이 좀 참신하게 느껴졌다. 파일은 offset이라는 elf 파일이 주어져 있다. 실행을 해 동작을 먼저 확인한 후, 보호 기법, 코드를 확인하겠다. 문제 파일을 실행하면 "Which function would you like to call?"이라는 문구가 출력된 후 입력을 받는데, 1을 입력하니 프로그램이 그대로 종료됐다. 보호 기법은 canary 빼고는 모두 걸려 있는 것을 볼 수 있다. ghidra로 main 코드를 확인해보면 위와 같다. gets 함수가 눈에 띄는데, 이 gets 함수를 통해 오버플로우를 일으킬 수도 있을 것 같다. gets 다음에 호출되는 select_func 함수도 확인해봤다. 입력 값이 ..
이번에 풀이할 문제는 HackCTF의 Simple_Overflow_ver_2 문제다. 문제 이름을 봤을 때 bof 관련 문제로 추정된다. 파일은 Simple_overflow_ver_2라는 이름의 elf 파일이 주어져 있다. 일단 어떤 동작을 하는지 실행해서 확인해보겠다. 실행을 하면 "Data : " 문구가 출력되면서 입력을 받는데, 입력을 하면 입력 값이 저장된 주소로 추정되는 16진수 값과 입력 값을 같이 출력해준다. 그 후 Again (y/n) 문구가 출력되며 입력을 받는데, y를 입력하면 이 과정을 다시 수행할 수 있고, n을 입력하면 프로그램을 종료한다. 동작은 확인했으니 보호 기법 및 코드를 확인해보겠다. RELRO 빼고는 보호 기법이 걸려지 않은 것을 볼 수 있다. ghidra를 통해 메인 ..
level 8에서 얻은 패스워드를 사용해 level 9 계정으로 로그인해보면 hint 파일만 존재하는 것을 볼 수 있다. cat 명령어로 hint 파일을 읽어보면 /usr/bin/bof 프로그램의 소스 코드가 출력되고 이를 이용해 level10의 권한을 얻으라는 문구가 출력된다. /usr/bin/bof 파일을 ls -al 명령어로 확인해보면 level10 권한으로 setuid가 걸려있는 것을 볼 수 있다. 이 프로그램의 취약점을 찾아 level10 권한으로 쉘을 얻는다면 level10 계정의 패스워드를 얻을 수 있을 것이다. 먼저 소스코드를 살펴보겠다. #include #include #include main(){ char buf2[10]; char buf[10]; printf("It can be ove..
DawgCTF 2021의 Bofit 문제다. elf 파일인 bofit과 c언어 소스 코드인 bofit.c가 주어져있다. bofit 파일을 우분투에서 실행해보면 다음과 같은 문구가 나온다. 문구를 읽어보면 "BOF it!"이 출력될 시 'B'를 입력, "Pull it!"이 출력될 시 'P'를 입력, "Twist it!"이 출력될 시 'T'를 입력, 'Shout it!"이 출력될 시 최소 10글자를 입력하라고 한다. 보호기법을 확인해본 후 소스 코드를 보면서 취약점을 찾아보겠다. 보호기법은 Partial RELRO만 걸려있는 것을 볼 수 있다. #include #include #include #include #include #include void win_game(){ char buf[100]; FILE* ..