Wargame

이번에 풀이할 문제는 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를 통해 메인 ..
· Wargame/FTZ
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..
보호되어 있는 글입니다.
보호되어 있는 글입니다.
이번에 풀이할 문제는 미루고 미뤘던 Format String Bug 취약점 관련 문제다. 예전부터 계속 fsb 취약점을 공부하려 시도했지만 뇌정지가 오거나 이해가 안되는 부분이 많아, 여러 번 실패했었다. 맘 잡고 몇 시간 정도를 fsb 취약점만 공부한 끝에 결국 fsb 취약점을 이해해버렸다. (취약점 관련 포스팅도 조만간 할 계획이다.) format string bug 취약점 공부에 참고한 사이트 d4m0n.tistory.com/28 dreamhack.io/learn/3#t194 (dreamhack은 전설이다..) 따라서 이번에는 fsb 취약점을 몰라 풀지 못한 HackCTF의 Basic_FSB 문제를 풀이해보겠다. 문제 파일은 elf 파일 basic_fsb가 주어져 있다. 먼저 보호기법을 확인해보겠다..
이번에 풀이할 문제는 HackCTF의 x64 Simple_size_BOF다. 문제 이름으로도 알 수 있듯이 x64 환경에서의 Buffet oveflow 공격을 수행해야한다. 이번에는 ida가 아닌 ghidra로 분석을 해봤다. 디컴파일 창을 보면 알 수 있듯이 27952 크기의 char형 배열을 생성하고 이 배열의 주소를 출력한 후 bof 공격에 취약한 gets 함수를 통해 입력을 받는다. 현재 생각할 수 있는 공격은 두 가지다. 1. gets 함수로 bof를 일으켜 쉘을 따게 해주는 함수의 주소로 RET 변조. 2. gets 함수를 통해 쉘 코드 삽입 + bof를 일으켜 쉘 코드의 주소로 RET 변조 일단 공격 코드를 짜기전 프로그램을 실행해보고 gdb, checksec을 통해 좀더 정밀하게 분석을 해..
이번에 풀이할 문제는 pwnable.kr의 random 문제다. 문제 문구는 "아빠가 프로그래밍에서 랜덤 값을 어떻게 사용하는지 가르쳐 주셨다"다. 접속하니 flag, random, random.c가 주어져 있어서 먼저 cat random.c 명령어로 소스 코드를 확인해봤다. #include int main(){ unsigned int random; random = rand(); // 랜덤 값(?) 생성 unsigned int key=0; scanf("%d", &key); // key 입력 if( (key ^ random) == 0xdeadbeef ){ // key xor random한 값이 0xdeadbeef와 같다면 flag 획득 printf("Good!\n"); system("/bin/cat fla..
마지막 12주차 과제의 마지막 문제는 pwnable.kr의 leg를 선정했다. 이유는 최근 도제 교육을 받게된 회사에서 arm 아키텍처 리버싱을 주로 배우기 때문에, arm 관련 문제인 leg를 포스팅하고 싶었다. 일단 문제 파일(c코드 하나, 어셈블리 코드 하나)이 주어진다. 이 문제 파일을 분석 후 아래 주소로 접속해 flag를 따내는 것이다. #include #include int key1(){ asm("mov r3, pc\n"); // pc 레지스터의 값을 반환 } int key2(){ asm( "push{r6}\n" "addr6, pc, $1\n" "bxr6\n" ".code 16\n" "movr3, pc\n" // r3에 pc 레지스터의 값을 넣음 "addr3, $0x4\n" // r3에 0x..
이번 문제는 bof 문제와 다르게 바이너리 내에서 flag을 찾는 방식이다. pwnable.kr은 문제 하나하나가 새로운 방식이라 재밌는 것 같다. 일단 문제의 문구는 "아빠가 압축된(포장된) 선물을 줬어, 열어 봤어!"다. 리버싱 문제들을 어느정도 풀어봐서 그런지 packed라는 단어를 봤을 때 패킹(실행 압축) 돼 있지 않을까 생각이 들었다. 일단 ida를 통해 확인해봤지만 예상대로 패킹이 돼 있어 제대로 분석이 불가능한 상황 같다. 문자열 탭을 확인해보면 upx 관련 문자열이 보이는 것을 알 수 있다. 따라서 이 프로그램은 upx로 패킹됐다 가정하고 깔려 있던 upx 프로그램으로 언패킹 해봤다. 성공적으로 언패킹된 것을 볼 수 있다. 다시 ida로 까본다면 제대로 코드가 보이는 것을 볼 수 있다. ..
dyp4r
'Wargame' 카테고리의 글 목록 (5 Page)