System&Write up 87

[Plaid CTF 2013] ropasaurusrex

[plaidCTF-2013 ropasaurusrex] 32bit binary이고 NX가 걸려있습니다. main 함수에서는 어떤 함수를 호출하고 WIN을 출력합니다. 함수를 따라 들어가보면, bp-0x88에 위치한 buf에 read 함수로 0x100만큼 입력을 받아 BOF가 발생합니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 payload = "" payload += "A"*(0x88 + 0x4) payload += p32(read_plt) payload += p32(pppr) payload += p32(0) #stdin payload += p32(e.bss()) payload += p32(8) #len(/bin/sh) payload..

System&Write up/CTF 2018.01.03

[pwnable.kr] Toddler's Bottle - coin1

[pwnable.kr] Toddler’s Bottle – coin1 N개의 동전 중 1개의 위조 동전이 껴 있는데, C번의 기회 안에 위조 동전을 알아내야합니다. 처음에는 한 번만 맞추면 되는 줄 알았습니다. 그래서 수작업을 시도했다가 교육 한 번 당했으니, 코드를 짜도록 하겠습니다. 일단 2000명의 관람객 중 도둑이 보석을 도둑질하고 다른 색깔의 보석을 끼워 넣었다. 적어도 몇 번 “보석은 무슨 색이었습니까?”를 물어봐야 찾을 수 있나? 라는 문제와 비슷한 것 같습니다. 이진 탐색은 정렬되어 있어야 하고, 시간 복잡도가 log N입니다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505..

[pwnable.kr] Toddler's Bottle - cmd2

[pwnable.kr] Toddler’s Bottle – cmd2 cmd1처럼 환경 변수를 사용하지 못 합니다. flag 문자열은 와일드 카드 *을 이용해서 우회하면 되지만, PATH를 바꿔 놓고, /도 필터링합니다. ‘ /bin/cat f* ’ 이렇게 전달해주고 싶은데, 어떤 방법으로 /를 우회해서 전달할 수 있을까요? echo 명령어의 옵션 중 –e는 이스케이프 문자를 사용할 수 있게 해줍니다.ex) echo –e “\a” -> 경고음 소리 출력 echo –e “\n” -> 개행 문자 출력 echo –e “\nnn”-> ASCII Code가 nnn(8진수)인 문자 그래서 echo –e를 사용하면 ‘ /bin/cat f* ‘를 만들 수 있을 것입니다. 문자열에서 /를 없앴습니다. 이렇게 ‘ /bin/c..

Linux 환경 변수 '?'

쉘의 환경 변수 '?'를 알아보도록 하겠습니다. '?'라는 환경 변수는 바로 전 프로그램의 return 값을 가지고 있습니다. 보시면 어떤 정수를 return 해주는 함수를 만들었습니다.그리고 호출할 때마다 '?' 환경 변수의 값이 계속 달라지는 것을 볼 수 있는데요.('?' 환경 변수의 값을 출력하고 싶으면, echo $? 라고 입력하면 됩니다.) 재미있게도, '?'는 전 프로그램의 return 값을 가진다는 것을 알 수 있습니다. sh 쉘에서도 마찬가지인 것을 볼 수 있습니다. 그렇다면 간단한 문자열을 비교하는 C 코드를 짜보도록 하겠습니다. 이 code는 문자열을 4byte(+NULL Byte) 입력 받고, strcmp로 "asdf"와 비교한 return 값을 return해 줍니다. strcmp 함..

[제 1회 Root CTF] Point to pointer! - (529 point)

기대를 안고 문제를 풀기 시작했습니다. main 함수 소스입니다. String을 봤는데 “/bin/sh”도 있습니다. 막 찾던 도중, 여기서 쓰이는 걸 발견했습니다. 다시 main함수를 보면 buf를 0x30(48)byte만큼 잡고, (_QWORD *)buf + 2 즉, 16byte를 건너 뛰고 그 자리에 어떤 함수의 주소를 넣습니다. welcome to RootCTF! 를 출력해주는 함수입니다.(_QWORD *)buf + 2를 호출하면 저 함수가 실행될 것입니다. read로 사용자에게 buf에 입력을 받고, Y를 받으면 다시 (_QWORD *)buf + 2를 호출합니다.read로 받을 때 0x64(100)byte를 받기 때문에, (_QWORD *)buf + 2를 조작할 수 있어요! (_QWORD *)b..

System&Write up/CTF 2017.12.24

[pwnable.kr] Toddler's Bottle - shellshock

[pwnable.kr] Toddler’s Bottle – shellshock 디렉터리에 bash 쉘도 있습니다. bash 쉘에 대한 충격적인 뉴스라고 하네요. 그래서 bash shellshock에 대해서 검색해봤습니다. version을 보니 shellshock 취약점이 있었던 때의 bash인 것 같습니다. 일단 기본적인 것부터 얘기하도록 하겠습니다. 쉘에서 변수를 만들고 싶으면 x=1 이렇게 대입하고 echo $x 이렇게 출력해보면 됩니다. 하지만, 완벽하게 환경 변수에 올리고 싶으면 export x=1 해줘야 합니다. 그리고 환경 변수에 함수도 등록할 수 있습니다. 마찬가지로 hello() { echo hello; } 이렇게 만들고, export –f hello 로 등록해줄 수 있습니다. 하지만 exp..

[pwnable.kr] Toddler's Bottle - mistake

[pwnable.kr] Toddler’s Bottle – mistake 힌트는 연산자 우선순위입니다! 코드입니다. password 파일에서 10byte만큼 password를 읽고, pw_buf에 넣습니다.scanf로 10byte만큼 사용자의 입력을 받고, pw_buf2에 넣습니다.pw_buf2를 1로 xor합니다.pw_buf와 pw_buf2를 비교해서 같으면 flag를 출력합니다. 여기서도 마찬가지로 사용자의 입력은 char형이므로 ASCII 값이 들어간다는 것을 생각해줘야 합니다. 연산자 우선순위에 무슨 문제가 있나? 하고 봤습니다. 이 두 부분은 개발자가 의도한 흐름대로 움직이지 않습니다. 왜냐하면 ‘연산자 우선순위’ 때문입니다. 분명 open(), read()의 반환 값을 fd, len에 넣고, 그..

[pwnable.kr] Toddler's Bottle - cmd1

[pwnable.kr] Toddler’s Bottle – cmd1 환경 변수를 이용하는 문제인 것 같다. system에 사용자의 입력을 인자로 전달해서 실행하는데, flag, sh, tmp가 있으면 안 됩니다. 일단 환경 변수 PATH가 바뀌었으니 절대 경로로 입력해야 합니다. flag도 우회해야 하는데, 그냥 환경 변수에 “/bin/cat /home/cmd1/flag” 문자열을 넣고 환경 변수를 인자로 전달하면 될 것 같습니다. 좋습니다. 환경 변수에 문자열이 저장되었으니, 이제 전달해야 합니다. 백 쿼터로 묶으면, 실행한 후 출력 값을 넣기 때문에 원하는 결과가 나오지 않습니다. 싱글 쿼터로 묶으면, 문자열 자체가 들어가기 때문에 flag가 출력됩니다. 그리고 쉘의 와일드카드로 쉽게 flag를 출력할..

반응형