전체 글 292

[제 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

[CTF] 제 1회 서울 디지텍 고등학교 청소년 해킹 방어 대회 후기 (7등)

[제 1회 서울디지텍고등학교 청소년 해킹방어대회 후기] 157명이 참가한 서울 디지텍 고등학교 청소년 해킹방어대회에서 7등을 했습니다. 대회는 2017-12-22 AM 9:00 ~ 2017-12-23 PM 9:00 36시간동안 진행되었고,1등이 상금 50,000원2, 3등이 상금 30,000원4, 5, 6등이 상금 20,000원7, 8, 9등이 상금 10,000원 입니다. 이번에 처음으로 CTF에서 상을 탔는데, 많은 동기부여가 되었습니다. 앞으로도 더 열심히 공부해서 더 좋은 성적 거둘 수 있었으면 좋겠습니다. 사실 3등 -> 4등 -> 5등 -> 7등 떨어지면서 마음이 초조하고 한 문제라도 더 풀고 싶어서 계속 붙잡고 있었지만, 풀지 못한 게 너무 아쉽습니다. CTF를 진행해 준 서울 디지텍 고등학교..

[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를 출력할..

[pwnable.kr] Toddler's Bottle - lotto

[pwnable.kr] Toddler’s Bottle - lotto 나머지, main과 help 함수는 분기와 출력 밖에 없어서 가져오지 않았습니다. 우선 6byte를 입력합니다. 그리고 /dev/urandom에서 난수를 가져와서 범위를 1~45로 만듭니다. 숫자가 맞으면 continue를 이용해서 중복 체크(?) 후 다음 루프를 돌아야 하는데, 그렇지 않습니다. 총 6 X 6 = 36번 비교를 해서 6번 같아야 합니다. 같은 값 6개를 입력했을 때, lotto 배열의 값 중 하나만 그 값과 동일하다면 flag를 출력하겠네요. 당연히 확률도 월등히 높아지겠죠. 그렇다고 숫자를 6개 입력한다거나 하면 flag가 출력되지 않습니다. 정수로 받는 것이 아니기 때문에 48 ~ 57 범위의 값이 들어가게 됩니다...

[pwnable.kr] Toddler's Bottle - blackjack

[pwnable.kr] Toddler’s Bottle - blackjack millionares. 백만장자에게 flag를 준다고 합니다. 들어가면 화려한 아스키아트를 볼 수 있습니다. 게임 진행, 룰 확인, 게임 나가기 3가지 기능이 있습니다. 룰을 보고 게임을 좀 해봤는데 1승 4패였습니다ㅜㅜ 각설하고, 링크 들어가보면 긴 C 코드가 있습니다. 아스키아트가 많아서 빠르게 읽을 수 있었습니다. 랜덤 카드 생성, 게임 실행 후 이러쿵 저러쿵 초기 셋팅하는 부분을 지나고 났는데 이상한 부분을 발견했는데요. 베팅 금액이 가진 돈보다 큰가? 검사해서 베팅 금액이 크다면 입력을 다시 받고, 다시 검사해야하는 게 맞습니다. 하지만 이 코드에서는 if문 안에서 다시 입력을 받기 때문에 가지고 있는 돈보다 많은 양의 ..

FTZ level20 -> clear Write up(Python)

FTZ 20 Level printf에 bleh라는 문자열을 바로 집어 넣으면서 FSB 취약점이 생기게 됩니다. printf에서 %x를 쓰면 ebp-8부터 -4씩 감소하면서 인자를 읽어 오게 됩니다. 여기서 확인할 수 있는 것은 bleh 배열의 시작 위치와 printf의 ebp+8 사이에는 12byte의 공간이 존재한다는 것입니다. bleh 배열의 시작 위치는 ebp+20이라는 것을 알 수 있습니다. 그리고 %n와 %정수c를 이용해서 원하는 주소의 메모리에 원하는 값을 넣을 수 있습니다. 고정된 주소인 main 함수의 소멸자 부분 .dtors의 __DTOR_END__의 값을 셸코드의 주소로 변조하면 main 함수가 끝난 후에 쉘이 실행될 것입니다. 0x08049594입니다. __DTOR_END__는 +4 ..

반응형