목록Write up (43)
ipwn
LOB를 한 번 공략해보겠다. LOB는 aslr이 걸려있지 않으며 NX가 걸려있지 않다. 그리고 dummy값도 없다. 즉 return address를 shellcode address로 옮겨서 shellcode를 실행할 수 있다는 말이다. 또, 기본 쉘인 bash가 \x90(nop)를 \x00(NULL)으로 착각하는 오류를 발생시켜서 bash2를 실행시켜주고 진행을 하는게 편하다. 서버 구축은 일단 생략하고 시작하도록 하겠다. 첫 단계는 gate단계이다. 그리고 password는 gate이다. 접속을 하고 파일들을 살펴보니 gremlin.c와 gremlin 파일이 있다. 한 번 소스코드를 보겠다. 일단 argv[1]에 값을 받아서 buffer에 복사를 해준다. 그런데, strcpy함수는 길이 제한없이 다 ..
이번 문제는 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 함수가 ..
Passcode문제이다. 읽어보니 컴파일 중 컴파일러가 경고를 했다는 것 같은데.. 한 번 서버 접속을 해보자. 코드를 읽어보니 이름을 받아오고 passcode1 == 338150, passcode2 == 13371337일 경우 플래그를 읽어준다. 하지만 이상한 점이 있다. scanf로 passcode1, passcode2를 입력 받는 부분을 보면 &연산자가 없다. 주소를 참조해서 변수에 입력을 하는 scanf인데, 변수의 주소가 아닌 그냥 passcode1, passcode2라는 변수를 넣었기에 그 변수의 값을 참조해 입력값을 받아온다는 것이다. 즉 이 곳에서 컴파일러가 경고문을 띄워줬다는 것을 알 수 있다. 만약 passcode1, passcode2의 변수에 원하는 주솟값이 있다면 그 주소안의 값을 ..
flag문제를 풀어보자. 이번 문제는 포너블문제가 아니라 리버싱 문제다. 글을 읽어보니 패킹이 되어있는 것 같다. 일단 binary파일을 받아보자. binary파일을 받고 ida로 연 뒤 바로 string을 보았다. string을 보니 UPX Packing이 되어있는 것 같다. UPX unpacking 툴을 다운받고 flag파일을 언패킹 해보자. 성공적으로 언패킹 된 것을 확인할 수 있다. 이제 ida로 언패킹 된 flag파일을 확인해보자. 분명히 아까보다 뭐가 많이 보일 것이다. 이제 string에서 한 번 flag를 찾아보자. 이렇게 언패킹을 마치고 난 뒤 string을 보게되면 flag가 대놓고 있다.