목록분류 전체보기 (101)
ipwn
ls 명령어 ls 명령어는 list segments의 약자로써 가장 많이 사용하는 리눅스 명령어 중 하나이다. ls는 보통 지정한 디렉토리나 파일의 정보를 출력하는데 사용한다. -a 옵션은 숨겨진 파일까지 보여주며, -l 옵션은 디렉토리 내 파일을 더 자세히 보여주는 역할을 한다. cd 명령어 리눅스 명령어 cd는 디렉토리를 이동시킬때 사용하는 명령어다. 사용법은 cd [디렉토리 경로] 와 같은 방식으로 이뤄진다. cat 명령어 cat 명령은 파일이름을 인자로 받아서 그 내용을 쭉 이어주는 역할을 한다. 결국 어떤 내용을 받아서 그냥 그대로 터미널 화면에 뿌려주는 역할을 한다. cat > file 과 같은 형식으로 사용하면 file에 원하는 내용을 작성할 수 있다. vim 명령어 vim이란 간단히 말해서..
레지스터란 특정한 목적에 사용되는 일시적인 기억 장치를 의미하며, 데이터를 읽고 쓰는 기능이 매우 빠르고, 중앙 처리 장치(CPU) 내부에 사용된다. IA 32(x86) CPU는 크게 5종류의 레지스터가 있다. 범용 레지스터, 인덱스 레지스터, 포인터 레지스터, 부동 소수점 레지스터, 플래그 레지스터와 같은 레지스터들이 그 것을 의미하며 각각 사용용도가 모두 다르다. 레지스터들 앞에 붙어있는 E는 Extended의 약자이다. 1. 범용 레지스터 EAX : 곱셈과 나눗셈 명령에서 자동으로 사용되고 함수의 리턴값이 저장되는 용도로 사용된다. EBX : ESI나 EDI와 결합하여 인덱스에 사용된다. ECX : 반복 명령어 사용시 카운터로 사용돤다. ECX 레지스터에 반복할 횟수를 지정해놓고 반복 작업을 수행한..
프로그램이 실행 되려면 프로그램이 메모리에 먼저 로드가 되어야 한다. 또, 프로그램에 사용되는 변수들을 저장할 메모리 공간도 필요하다. 메모리 구조에는 대표적으로 1. 코드 (code)영역 2. 데이터 (data)영역 + BSS (Block Stated Symbol) 영역 3. 스택 (stack)영역 4. 힙 (heap)영역 이런 식으로 크게 네 가지, 세세하게 다섯 가지 정도가 있는데, 설명하기에 앞서 먼저 다음 그림은 운영체제가 제공하는 메모리 공간을 표현한 그림이다. 1. 코드 (code) 영역 메모리 낮은 주소에 속하는 코드 영역은 실행할 프로그램의 코드를 저장하는 영역으로 텍스트 영역이라고도 부른다. CPU는 코드 영역에 저장된 명령어를 하나 하나 씩 가져가서 처리하는데, 이러한 코드 영역은 H..
이번 문제는 shellshock문제이다. 글을 읽어보면 bash shell에 대한 충격적인 뉴스가 있었다고 한다. shellshock 취약점을 잘 알고있는지 묻는 문제인듯하다. 서버에 접속해보겠다. 파일들을 보니 bash와 shellshock 파일이 있다. 분명 저 bash는 shellshock취약점이 있는 버전일 것이다. 확인해보니 일반 bash의 버전은 4.3.46버전으로 shellshock의 취약점이 패치 된 이후의 버전이다. 하지만 디렉토리에 있는 bash의 버전은 4.2.25버전으로 shellshock이 존재하는 버전이다. 쉘에서 변수 생성은 asdf="asdf" 과 같이 이뤄진다. 변수를 생성한 뒤 export asdf 을 하게 된다면 환경변수에 등록할 수 있다. 그리고 asdf() { ech..
이번 문제는 mistake문제이다. hint가 operator priority 즉 연산자 우선순위라고 한다. 한 번 서버에 접속해서 코드를 보겠다. 이 코드는 간단하게 password파일을 가져와서 입력받은 값을 1로 xor한 값과 비교해서 만약 같은 값을 갖고 있다면 flag를 읽어와주는 코드라고 볼 수 있다. 하지만 이 코드에는 큰 결함이 있다. 일단 결함을 설명하기 전에 사진을 하나 보겠다. 이 사진에서 위에있을 수록 연산 우선순위가 높은 것을 의미한다. 즉 대소 비교 연산자는 대입 연산자보다 우선순위가 높은 것을 알 수 있다. 이제 다시 한 번 코드를 보겠다. 코드에서 이 부분을 보게되면 아차! 할 것이다. (참고로 password파일은 존재하기에 파일은 무사히 열린다.) 개발자의 의도는 fd에 ..
이번 문제는 cmd2 문제이다. 비밀번호는 cmd1의 flag이니 못 푼사람들은 풀고 오시길 바란다. 보아하니 cmd1의 문제에 필터링만 조금 더 추가되었을 것 같다. 진짜 필터링이 더 추가됐긴 한데, 너무 많이 추가된 것 같다... 일단 실행 후 환경변수 등록이 불가능하고, /, flag등등 다양한 문자들을 필터링 처리한 뒤 환경변수까지 막아버렸다. 우리가 실행시켜야 할 명령어는 간단히 /bin/cat flag이다. bin이나 cat는 필터링이 안되어있으니 우회할 필요도 없고, flag는 와일드 카드 *나 ?를 이용해서 우회를 할 수 있지만 /를 우회하는게 관건인 문제인듯 하다. 일단 환경변수를 막았고, 실행 중 등록도 불가능하니 환경변수로 풀 수 있는 문제는 아닌 것 같다. 그래서 우회 방법을 찾다가..
이번 문제는 cmd1문제이다. 한 번 서버에 접속해보겠다. 코드를 보니 argv[1]을 system함수로 넘겨주어 명령어를 실행시켜야 한다. 하지만 sh, tmp, flag는 필터링 해놓았다. 그리고 환경변수 PATH를 바꿔버렸다. 즉 명령어의 절대경로를 입력해야 명령어가 실행될 것이다. 그렇다면 필터링을 피해서 어떻게 실행을 할 수 있을지 고민해보자. 나는 환경변수가 생각나서 환경변수로 풀었다. 일단 환경변수를 저렇게 등록하고 $fl을 입력해보면 flag를 읽어오려는 시도를 하는 걸 알 수 있다. 환경변수를 저렇게 등록한 이유는 프로그램을 실행하면 환경변수 PATH를 바꿔버려, 절대경로로 입력을 해야 명령어 사용이 가능하기 때문이다. 이 환경변수를 cmd1 프로그램에 넣어서 setuid가 걸린채로 fl..
이번 문제는 lotto 문제다. 한 번 무슨 오류가 있는지 찾아보자. 서버에 접속하고 바로 코드를 보겠다. 코드를 해석해보면 먼저 submit이라는 6칸 문자열 공간에 입력하고싶은 값을 입력해준다. 그리고 lotto 변수에는 6칸 각각 랜덤한 값이 들어간다. 1 ~ 45의 숫자가 대입된다. 랜덤값을 대입할 때는 이상한 점이 없어 보인다. 그리고 그 뒤에 랜덤값과 입력한 값을 비교해서 같을 경우 match값을 올려주고, match값이 6이 될 경우에는 flag를 읽어와준다. 그런데 submit과 lotto를 비교하는 부분이 이상하다. 분명 같은 index에 있는 값들을 비교해야 하는데, lotto[i] 에 있는 값을 submit[j]와 비교한다. 만약 이런 식으로 비교를 하게 된다면, lotto[i]의 값..
이번 문제는 blackjack문제이다. 문제 이름 그대로 blackjack게임을 하면 되는 문제다. 저 글에 적힌 링크로 가면 nc 서버에서 실행되는 프로그램의 C 코드를 볼 수 있다. (룰은 https://goo.gl/sy3C2G에서 볼 수 있다. 간단히 말하자면 딜러가 준 카드의 합이 21에 가까운 사람이 이기는 게임이다.) 뭔가 딱 봐도 베팅할 때 문제가 터질 것 같은 느낌이라 봤는데, 정말이었다. 보면 일단 베팅하는 값이 음수일 때를 검사하지 않고, 보유 자산보다 큰 값을 베팅 할 때는 처음에는 에러를 띄워준다. 하지만 그 이후 한 번 더 입력을 받을 때는 더 큰 값을 입력해도 그냥 베팅이 돼버린다. 즉, 정상적이지 않은 음수값을 입력해서 게임을 일부러 패배해서 돈을 매우 많이 벌 수 있고, 보유..
이번 문제는 random문제이다. 글은 딱히 읽어볼 필요 없는 것 같다. 서버에 접속해보자. 코드를 보니 rand함수로 random변수에 값을 넣어주고 그 값과 우리가 입력해준 key값을 xor한 값이 0xdeadbeef와 같을 경우에 flag를 읽어와준다. 그리고 같지 않을 경우에 2의 32제곱의 케이스만큼 시도해야할 것이라고 우리에게 말한다. 하지만 이 코드에는 결함이 있다. 바로 srand함수가 없다는 것인데, 이 srand함수로 seed 값을 정해줄 수 있다. 이 seed값에 따라 rand 함수를 실행해서 나온 값이 달라진다. 그래서 이 srand함수로 seed값을 time으로 넣어준다면 시간이 경과할 때 마다 seed값이 달라지므로 실행할 경우 계속해서 결과값이 달라진다. 즉 srand 함수가 ..