🔐 보안/👾 Pwnable

    Pwnable.kr :: Toddler's Bottle - mistake write up

    Pwnable.kr :: Toddler's Bottle - mistake write up

    대단한 해킹 실력은 필요없다고 말하는 mistake 문제. 사실인지 확인해보자. 힌트는 operator priority 라고 한다. 소스 코드를 확인하자. 소스 코드를 하나씩 확인해보면, 우선 open() 함수로 password 파일을 연다. 그리고 open() 함수가 return 하는 file descriptor 값이 fd 변수에 들어가고 0과 대소 비교를 하는 줄 알았는데 .... ! 힌트에서 알 수 있듯이 연산자 우선순위를 살펴보자 .. 이 부분에서 시간을 많이 썼다. if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0) 이 조건식 안에서 = 과 < 연산자의 우선순위는 < 연산자가 높다. 즉, open() 함수가 return 하는 fd 값과 0을 먼저 ..

    Pwnable.kr :: Toddler's Bottle - leg write up

    Pwnable.kr :: Toddler's Bottle - leg write up

    pwnable.kr 의 leg 문제를 풀어보자. 문제를 들어가면 arm 에 배워야 한다고 말한다. 하지만 본인은 leg 가 더 좋다고 한다.. pwnable.kr 의 감성 아직은 따라가기 버겁다... 우선 ARM architecture 에 대해 알아보자. 임베디드 기기에서 많이 사용되는 RISC 프로세서로, 저전력을 사용하도록 설계하여 ARM CPU 는 모바일이나 싱글 보드 컴퓨터에서 뚜렷한 강세를 보인다고 한다. 출처 : https://ko.wikipedia.org/wiki/ARM_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98 ARM 아키텍처 - 위키백과, 우리 모두의 백과사전 64/32비트 아키텍처발표2011년 (10년 전)(2011)버전Armv8-A, Armv8.1-A, Armv..

    Pwnable.kr :: Toddler's Bottle - random write up

    Pwnable.kr :: Toddler's Bottle - random write up

    random 문제를 풀어보자. 첫 번째 fd 문제와 동일하게 1pt 짜리 문제이다. 실제로도 크게 어렵지 않은 문제였다. 문제를 살펴보자. 역시나 세 개의 파일이 존재한다. 소스코드를 보자. rand() 함수를 이용해 랜덤값을 만들어 random 변수에 저장하고 scanf() 로 입력받은 값과 xor 연산을 해서 연산 결과가 0xdeadbeef 이면 flag 를 출력한다. 이 문제를 풀 때 알아야 할 것이 하나 있는데, rand() 함수는 프로그램이 실행될 때 값이 정해진다. 즉 프로그램을 여러번 실행시켜도 동일한 값이 나온다는 것이다. 프로그램 실행 시 매번 다른 난수를 얻고 싶다면 srand() 함수를 사용해야 한다. 그럼 우리는 rand() 함수를 실행시킨 뒤 해당 값을 알아내기만 하면 끝이다. 역..

    Pwnable.kr :: Toddler's Bottle - passcode write up

    Pwnable.kr :: Toddler's Bottle - passcode write up

    pwnable.kr 의 다섯 번째 문제 passcode 를 풀어보자. ssh 로 접속해보자. 이전 문제들과 같이 세 개의 파일이 존재한다. 소스코드를 훑어보자. 우선 눈여겨 봐야 할 부분은 login() 함수 부분이다. scanf() 로 정수를 입력받고 있다. 여기서 주의해야 할 부분이 있는데, passcode 변수에 정수값을 저장하는 것이 아니다. 우리는 흔히 scanf() 를 이용해 정수를 입력받을 때 다음과 같이 진행한다. scanf("%d", &passcode1); scanf() 함수에서 두 번째 인자에 해당하는 "&passcode1" 에 정수를 입력하라는 의미이다. 여기서 & (ampersand) 는 변수의 주소값을 가리킨다. 즉 두 번째 인자로 전달된 &passcode1 은 passcode1 ..

    Pwnable.kr :: Toddler's Bottle - bof write up

    Pwnable.kr :: Toddler's Bottle - bof write up

    Pwnable.kr 의 세번째 문제를 풀어보자. 이번 문제는 Buffer Overflow 에 대한 문제이다. Buffer Overflow 란, 데이터를 버퍼에 저장할 때, 데이터가 지정된 범위 바깥에 저장되는 것을 의미하고, 벗어난 데이터는 인접 메모리를 덮어쓰게 된다. nc 로 접속하면 bof 파일이 바로 실행되고, 그 전에 wget 으로 bof 파일과 bof.c 소스파일을 다운받아보았다. bof.c 소스파일은 main 함수와 func 함수로 이루어져 있다. main 함수에서는 func 함수를 호출하는 거 이외에 별다른 코드가 없고, 0xdeadbeef 라는 값을 인자로 넘기면서 func 함수를 호출하고 있다. func 함수에서는 0xdeadbeef 라는 값을 int 형 변수 key 에다가 넣고, ov..

    Pwnable.kr :: Toddler's Bottle - collision write up

    Pwnable.kr :: Toddler's Bottle - collision write up

    Pwnable.kr 의 두번째 문제를 풀어보자. 이번 문제는 MD5 hash collision 에 대한 문제라는 힌트를 주고 있다. 그러면 Hash 는 무엇이고 Hash collision 이 무엇인지 간단하게 알아보자. Hash 란 임의의 길이를 갖는 임의의 데이터에 대해 고정된 길이의 데이터로 매핑하는 것을 의미한다. 한 개의 입력값에 대해 한 개의 출력값이 나오는데, 이 입력값의 범위는 무한한 데 비해 출력값의 범위는 유한하기 때문에 입력이 다름에도 불구하고 드물게 동일한 값이 출력되는 경우가 존재한다. 이러한 경우를 '충돌' (Collsiion)이 발생했다고 한다. 이제 문제를 살펴보자. 역시나 flag 파일이 존재하고 권한이 없기 때문에 setUID 가 걸려있는 col 파일을 이용해서 문제를 해결..

    Pwnable.kr :: Toddler's Bottle - fd write up

    Pwnable.kr :: Toddler's Bottle - fd write up

    1번 문제 fd 를 풀어보았다. fd 는 File Descriptor 를 의미한다. 문제를 풀어보면 알 수 있듯이 File Descriptor 를 모르면 풀 수 없는 문제이다. 문제에서도 "What is a file descriptor?"라는 힌트를 주고 있다. ssh 로 fd@pwnable.kr 에 접속해보자. 파일을 살펴봤더니 flag 파일을 확인할 수 있으면 문제가 해결될 것 같다. 하지만 현재 권한이 없기 때문에 직접 볼 수는 없고, fd 파일에 setUID 가 걸려있으므로 fd 파일을 이용하면 flag 를 출력할 수 있을 것 같다. 우선 fd.c 파일의 소스코드를 확인해보자. main 함수의 매개변수로 들어가 있는 argc 는 명령 인자의 개수를 의미하고 argv는 인자의 벡터를 의미하는데, 인..