기본 콘텐츠로 건너뛰기

글

라벨이 PWN인 게시물 표시

PWN flag

PWN flag http://pwnable.kr/index.php (이번 pwn 은 윈도우에서 했다. 리눅스에서 하려 했는데 도저히 프로그램이 정상적으로 설치할 수가 없었다. ) 먼저 써진 주소를 입력해서 flag파일을 다운 받는다. 이 파일을 실행시키려 했더니 불가능했다. writeup에 나온 것처럼 리버싱을 하기로 했다. 리버싱이란 reverse와 engineering을 합친 단어로 실행 프로그램을 소스코드로 변환해 분석하는 작업을 의미한다. 먼저 IDA프로그램을 다운 받는다. IDA는 컴퓨터 소프트웨어용 디스어셈블러로 기계어 코드로부터 어셈블리어 코드를 생성한다. IDA에 flag함수를 넣어 확인했다. 찾기 기능을 통해 info를 검색했는데 flag프로그램에 대한 정보가 나와있었다. This file is packed with the UPX executable packer 여기서 나온 UPX는 오픈소스 실행 파일 압축 프로그램이다. 즉, flag파일은 UPX압프로그램을 통해 압축된 상태이다. 이 압축을 풀어주기 위해 UPX를 다운 받았다. 근데 압축이 해제가 되지 않아서 읽어보니 구버전 upx랑 호환되지 않는 다고..... 최신버전의 upx를 다시 다운 받았다. (http://upx.sourceforge.net/download/00-OLD-VERSIONS/ : 이곳에서 버전 별 upx를 다운받을 수 있다. ) 최신 버전의 upx를 사용해 flag파일의 압축을 해제했다. 이 상태로 다시 IDA로 가져가 코드 분석을 했다. 처음과 다르게 아는 함수가 여럿 나와있었다. 아까와 마찬가지로 검색기능을 이용해 flag를 찾았다. 성공!! 참고: https://ko.wikipedia.org/wiki/UPX https://ko.wikipedia.org/wiki/IDA_%ED%94%84%EB%A1%9C http://noisivohees.tistory.com/13 ...

PWN buf

PWN buf http://pwnable.kr/index.php 일단 writeup에 나온 나온 다운로드 주소를 firefox로 가서 입력한다. 그러면 파일을 다운받겠냐는 물음이 뜨는데 이걸 저장한 후 터미널에서 열어 확인해 보면 된다. 파일은 buf라는 c언어 파일인데 어떤 프로그램인지 확인하기 위해 열었다. 일단 mian함수에서는 func라는 함수를 실행하고 끝낸다. 그럼 func라는 함수를 살펴보자. 일단 인자로 int형인 key라는 값을 가져온다.   overflowme라는 문자열을 입력받는다.  key값이 0xcafebabe라면 성공이고 그렇지 않으면 실패하게 된다.  여기서 의문인 점은 입력은 overflowme라는 문자열을 받았으면서 왜 성공의 조건은 함수의 인자로 받는 key값을 통해 결정하는냐 이다. 이것은 버퍼 오버플로우를 통해 해결할 수 있다. 버퍼 오버플로우란 메모리에서 생기는 오류 중 한 종류로 프로그램 안에서 한 데이터가 버퍼에 저장될때 지정한 용량보다 많은 메모리를 차지하게 되면서 인접 메모리까지 덮어쓰게 된다. 위 프로그램에서 확인할 수 있듯이 main함수에서 key 값은 이미 프로그램 돼있다. 여기에서 사용자가 입력할 수 있는 것은 overflowme라는 문자열 하나이기 때문에 이 문자열을 적당히 넘치게 만들어 key값이 있는 메모리에 원하는 값을 넣으면 된다. 일단 bof.c라는 프로그램이 어떻게 메모리를 활용하고 있는지 알아보기 위해서 gdb를 썼다. gdb는 리눅스에서 사용할 수 있는 디버거이다. 시스템 스택에서는 주소가 높은 곳부터 낮은 곳으로 채워진다. 처음 스택세 push ebp를 하면서 시작하는데 이는 처음 함수를 불러오는 것을 말한다. 여기서 중요한 것은 overflowme와 key가 얼마나 떨어져 있는지를 알아내는 것이다.  <+29>를 보면 overflowme 배열이 시작하는 위치가 ebp-0x2c라는 것과 ...

PWNable

PWNable collision http://pwnable.kr/index.php writeup을 보면 MD5의 해시 충돌의 사용해 푸는 문제라는 힌트가 주어진다. 이제 저기에 나온 ssh로 접속해서 파일들을 확인했다. MD5란 MD5(Message-Digest algorithm 5)는 128비트 암호화 해시 함수이다. 해시 함수는 임의 길이를 가진 문자열을 입력받아 고정된 길이의 해쉬값을 출력한다. 말 그대로 함수를 생각하며 되는데 해쉬함수의 문제점은 충돌이 일어날 수 있다는 것이다. 즉, 특정 해쉬값을 나오게 하는 값이 하나가 아닐경우 해시 충돌이 일어났다고 말한다. col.c라는 파일이 보인다. 코드를 읽기 위해 cat명령어를 사용해 살펴봤다. if(입력한 단어의 수가 2개 미만)--> printf("usage: ~~") if (입력한 2번째 단어가 20바이트가 아니라면) --> printf("passcode~~") if (hashcode 와 check_password(두번째 단어)의 반환값이 같다면) --> 성공!! 그외의 경우 --> printf("wrong passcode.") col.c를 해석하면 다음과 같다. 성공을 하기 위해서는 hashcode의 값과 check_password(argv[1])의 밪환값이 같아야 하는데 hashcode는 처음에 0x21DD09EC라고 초기화 돼있다. check_password()함수는 전달받은 인자를 정수형으로 바꿔서 5번에 걸쳐 더한 다음 그 총 합을 반환한다. 따라서 이 값이 0x21DD09EC와 같으면 된다. 그럼 16진수 21DD09EC를 5 로 나누면 몫은 6C5CEC8이 나오고 나머지가 4이므로 4번은 6C5CEC8이고 한 번은 6C5CECC이여야 한다. 이 5번은 다 더하면 원하는 숫자 0x21DD09EC가 나온다. $는 실행 파일의 인자로 ()안에 있는 문자를 넣어준다는...

PWN fd

PWN fd http://pwnable.kr/play.php writeup을 보면 file desctriptor라는 단어가 나온다. file descriptor은 줄여서 fd라 말하는데 파일을 다룰때 사용한다. 파일 디스크립터는 음수가 아닌 정수로 번호를 항당 받아 사용하는데 이는 fd가 fd tabel로 부터 온 것이기 때문이다. 이들의 인덱스를 의미하기 때문에 음수가 아닌 숫자로 표현이 가능하며 fd는 파일을 가르킬 수 있도록 파일 테이블의 포인터를 포함한다. 0~2까지는 기본적으로 할당 된 프로세스들이 존재하고 새로운 파일을 열때는 이 외의 숫자로 fd가 할당된다.  fd 0은 표준 입력, fd 1은 표준 출력, fd 2는 표준 에러를 의미한다. 이제 우분투로 들어가서 위 사진에 나온 ssh를 입력해 접속했다. 가장 먼저 한 일은 어떤 파일과 디렉토리들이 있는지 확인하기 위해서 ls- al 명령어를 사용했다. 일단 fd.c라는 파일이 있길래 어떤 프로그램인지 확인했다. 코드를 해석하자면 아래와 같다. if(입력 단어가 2개 미만이면) "pass argv[1] a number" 출력 fd = 입력한 2번째 단어를 정수로 바꾼 수 - 16진수로 1234 buf에 fd가 가르키는 문자열 32 비트까지 넣어주기 if(buf가 LETMEWIN과 같다면) flag실행 "learn about linux file IO"출력 그럼 여기서 flag를 실행하기 위해서는 buf에 들어가는 문자열이 LETMEWIN이여야 한다. 그러기 위해서는 fd가 가르키는 문자열이 LETMEWIN이여야 하는데 이는 fd = atoi(argv[1]) - 0x1234 를 통해 해결 할 수 있다. 일단 atoi는 입력받은 문자열을 수로 변환시켜준다. 그렇다면 argv[1] - 0x1234의 값에 대해 생각해 봐야한다. 원래 fd는 파일을 가르키지만 여기는 열만한 파일이 없다. 즉, 사용자의 입력값을 받아줘...