pwnable.kr

    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는 인자의 벡터를 의미하는데, 인..