<Wargame & CTF>/Pwnable.kr 9

[Pwnable.kr] loveletter

#Pwnable.kr #loveletter #Rookiss loveletter 문제이다. main 함수의 처음 부분이다. 전역변수 loveletter 256 바이트를 0으로 셋팅 해놓고, epilog 와 prolog 문구의 길이를 산출해내어 지역변수에 저장해놓는다. 해당 전역변수들은 후에 사용된다. 그리고 256 바이트짜리 배열 s 에 값을 입력받는다. 취약점 촉발의 시작이다. 그리고 protect 함수에 s 를 집어 넣고 "약간" 의 s 배열 손질을 한다. protect 함수에서의 문제 로직은 대강 이러한데 strcpy 부분에 있는 특수문자 목록에 있는 문자가 s 에 있으면 즉시 멈춰서 해당 부분에 0xA599E2 를 때려박는다. 이 부분은 정확히 3바이트를 넣는 것처럼 보이지만, 디버거에서 보면 dw..

[Pwnable.kr] brainfuck

#Pwnable.kr #brainfuck #Rookiss brainfuck 문제이다. main 함수부터 까보면 위와 같이 생겼다. 단순히 fgets 로 입력받아오는 것처럼 보인다. 입력 받은 값을 전달하는 do_brainfuck 함수를 보자. do_brainfuck 함수의 모습이다. main 함수를 다시보면, tape(0x0804A0A0) 전역변수 값을 받아오는 전역변수 p(0x0804A080) 가 있는데 do_brainfuck 에서는 이 p 변수를 가지고 포인터조작을 할 수 있는 함수이다. " 결론적으로는 got_overwrite 문제이다. " 시나리오는 다음과 같다. p 변수와 멀리 떨어지지 않은 곳에 위와 같은 got table 이 존재하는데, 이곳은 do_brainfuck 함수에서 문자로 원하는 ..

[Pwnable.kr] horcruxes

#Pwnable.kr #horcruxes #Toddler horcruxes 문제이다. main 함수를 보면 다음과 같이 seccomp 설정과 더불어 init_ABCDEFG() 함수가 실행된다. 해당 init_ABCDEFG() 함수는 위와 같은데 /dev/urandom 에서 랜덤한 값을 시드로 하여 a, b, c, d, e, f, g 값을 랜덤으로 뽑아내는 함수이다. 그리고 핵심이라 할 수 있는 ropem 함수이다. 해당 함수는 위와 같이 생겼는데, A(), B(), C(), D(), E(), F(), G() 함수는 init_ABCDEFG 에서 만든 값들을 알파벳에 맞게 차례로 출력시켜주는 함수이다. 그리고 그 값들을 합친 sum 이 gets(s) 로 입력받은 s 값과 같으면 플래그를 출력시켜준다. 처음에..

[Pwnable.kr] asm

#Pwnable.kr #asm #Toddler asm 문제는 shellcode 를 제작하는 문제이다. 접속을 해서 readme 파일을 읽어보면, 원격지에 로컬에서와 같은 이름의 플래그 파일이 있고 읽어보라는.. 그런 내용이다. # asm.c #include #include #include #define LENGTH 128 void sandbox(){ scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) { printf("seccomp error\n"); exit(0); } seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 0); seccomp_rule_add(ctx, SCMP_ACT_ALLO..

[Pwnable.kr] memcpy

#Pwnable.kr #memcpy #Toddler memcpy 문제이다. 해당 코드를 컴파일하여 실행해보면, 위 처럼 heap 에 할당할 크기를 입력받고 자체적으로 개발한 memcpy 함수 두 개를 실행한다. 참고로, 해당 memcpy 함수는 slow_memcpy 와 fast_memcpy 이다. 아무튼 저렇게 입력 값을 주면 계속해서 slow_memcpy 와 fast_memcpy 를 실행하다가 128 값에서 프로그램이 Segmemtation fault 를 내뿜으면서 종료된다. 디버깅으로 알아보면, 위 부분에서 메모리에 데이터를 제대로 전달하지 못하고 꺼진다. movntps 어셈블리 명령어를 알아보면 What is movntps??? Description Moves the packed single-pre..

[Pwnable.kr] Unlink

#HeapOverflow #unlink Heap 공부를 본격적으로 다시 해보고자 이 문제로 시작했다. Heap 병합과정을 통해 생기는 리얼 Unlink 취약점은 아니고, 구조체를 직접 구현해놓고 Unlink 가 이루어지는 과정을 함수로 구현해놓았다. 보급형 Unlink 취약점 ? 이라고 할 수 있을 듯하다. 우선 청크 구조체는 이렇게 생겼다. fd, bk, 버퍼 요소가 들어있다. 크기는 16바이트 씩이다. main 함수에서 사용되는 것은 A, B, C 요소이다. 그 후, 바로 아래 코드와 같이 A, B, C 를 이중연결리스트 로 만든다. 그리고 남은 main 함수 로직은 이러하다 A 가 들어있는 스택주소 leak 시켜줌 A 의 주소 leak 시켜줌 gets 함수로 A 의 buf 에 무제한으로 쓴다. un..

[Pwnable.kr]shellshock

https://namu.wiki/w/%EC%85%B8%EC%87%BC%ED%81%AC 셸쇼크 - 나무위키 본격적으로 설명하기에 앞서 Bash의 환경변수에 대해 간략하게 알아보자. $ hi="안녕!" $ echo $hi 안녕!hi라는 변수를 생성, echo 함수를 통해 출력하는 구문이다. $hi를 입력했을 때 Bash shell은 c의 매크로처럼 "안녕!"이라고 변환해준다. $ hi="안녕!" $ export hi $ printenv | grep hi hi="안녕!"이번엔 변수를 선언하고 export를 통해 환경변수에 등록해보자. printenv로 환경변수 목 namu.wiki 꺼무위키에 설명이 잘 나와있었다. 취약점의 종류는 CVE-2014-6271 이다. bash에 대한 놀라운 소식이 있단다 ;; (s..

[Pwnable.kr]input

문제는 이렇다. 힌트가 될만한 건 없어보임. 들어가기에 앞서서, 이 문제는 pwntools의 소소한 사용법들을 많이 익힐 수 있었던 문제이다. 접속 후에 파일 목록을 보면 이렇다. C 소스를 주었다. 그 전에 우선 input 바이너리를 실행시켜보자. 문제에서는 프로그램에 input을 올바르게 넣으면 플래그를 준다고 한다. C소스를 보러가자. 우선 소스 맨 아래에 flag를 출력 시켜주는 함수 구문이 있다. 여기에 도달해야하는게 최종목표이다. 도달하기 까지 총 5단계의 과정이 있다. 첫 번째 단계이다. 바이너리에 argv 인자의 형태로 input을 잘 넣을 수 있는지 보는 과정이다. 우선 인자의 개수는 바이너리경로 포함 100개의 argv를 갖고있어야한다. (argc != 100) 그리고 argv['A']..

반응형